2012-08-27 4 views
9

मेरे पास एक संदेश है जो सीमा के भीतर है और एमडीआई ग्राहक क्षेत्र के सामने प्रदर्शित होता है। क्योंकि यह सिर्फ एक संदेश है, मैंने इसे IsHitTestVisible को गलत पर सेट किया है। सुविधा के लिए, मैंने इसके अंदर एक बटन भी शामिल किया है ताकि उपयोगकर्ता एक नया आरेख शुरू करने के लिए बस बटन पर क्लिक कर सके।आप किसी चीज़ के बच्चे पर IsHitTestVisible को True पर कैसे सेट कर सकते हैं जहां यह गलत है?

हालांकि, सीमा के पास IsHitTestVisibleFalse पर सेट है, यह बटन के True मान को शॉर्ट्स करता है ताकि उपयोगकर्ता बटन पर क्लिक न कर सके।

उसने कहा, आप माउस के लिए एक अदृश्य नियंत्रण कैसे बना सकते हैं, जबकि अभी भी अपने बच्चों में से एक को माउस ईवेंट प्राप्त करने की इजाजत है?

यहाँ एक स्क्रीनशॉट:

enter image description here

हम चाहते हैं कि पाठ के साथ नीले क्षेत्र मारा परीक्षण किया जाना है अदृश्य है, लेकिन हम चाहते हैं बटन अभी भी दबाया जा करने में सक्षम हो। विचार? (और हाँ, मैं पहले से ही एक ग्रिड में दो आइटम stacking के बारे में पता है, लेकिन है कि लेआउट के साथ छेड़छाड़ न।

+1

मुझे लगता है कि आपको 'ग्रिड' का उपयोग करके अपने लेआउट को ठीक करने के बारे में और अधिक भाग्य मिलेगा, जिसमें आप एक दूसरे पर खड़े दो नियंत्रणों के साथ 'IsHitTestVisible = true' सेट करने का तरीका ढूंढेंगे, लेकिन किसी भी तरह से हिट परीक्षणों को अनुमति दें एक बच्चा आइटम आपके पास किस प्रकार का लेआउट है? – Rachel

+0

आप अपने UIElement के साथ हिट व्यवहार निर्धारित करने के लिए HitTestCore को ओवरराइड कर सकते हैं (ऐसा लगता है कि आपने UserControl बनाया है) ...... लेकिन राहेल की तरह कहते हैं ... ग्रिड या विभिन्न लेआउट का उपयोग करें। –

+0

हाँ, मेरे पास पहले से ही हल्का वजन वाला नियंत्रण है जिसे लेयरपैनल कहा जाता है जो चीजों को एक-दूसरे के ऊपर ढेर करता है। सभी मापों को ग्रिड से बाहर कर देता है, जो प्रदर्शन में कुख्यात रूप से खराब है। फिर भी, मुझे चीजों को ले जाने से नफरत है, क्योंकि तब जब टेक्स्ट स्थानीयकरण के लिए बदलता है, तो यह लेआउट को धक्का देता है और अब आपको कुछ अनचाहे कुछ के सामने कुछ संरेखित करने की चिंता करने की ज़रूरत है। मज़ा नहीं। करने योग्य, लेकिन मजेदार नहीं। – MarqueIV

उत्तर

1

ठीक है, ऐसा नहीं लगता है कि सवाल पूछे जाने पर हल किया जा सकता है, और इसलिए ऐसा लगता है कि हमें स्तरित विधि पर वापस जाना है। उस स्थिति में, पाठ परिवर्तनों की भरपाई करने के लिए, आपको बटन के ऊर्ध्वाधर संरेखण को नीचे से सेट करना होगा, और यह सुनिश्चित करना होगा कि लेबल हमेशा टेक्स्टबॉक पर सीमा के निचले किनारे पर या अतिरिक्त मार्जिन पर अतिरिक्त पैडिंग है) यह सुनिश्चित करने के लिए कि लेबल हमेशा ऊपर से ऊपर तैरता है बटन। आप दोनों सिद्धांतों का उपयोग करके दोनों के लिए साइड मार्जिन/पैडिंग का प्रबंधन करते हैं।

यह हमें वह देगा जो हम बाद में हैं, लेकिन बस बहुत बोझिल लगता है। दोबारा, मेरी इच्छा है कि IsHitTestVisible (या उस मामले के लिए सक्षम है) को 'फोर्स' के साथ किसी भी तरह से निर्दिष्ट करने का कोई तरीका था जो व्यवहार के मालिक के रूप में उन्हें (और नीचे) फिर से स्थापित करता है। एक व्यक्ति सपना देख सकता है। तब तक ... परतें यह है!

+0

सपने देखने के बजाय आप मेरा संपादित उत्तर देख सकते हैं :) – Erez

+0

यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है, और आप IsEnabled का भी उपयोग कर रहे हैं जो कई बार कर सकता है, नियंत्रण की रूप बदल सकता है। इसके अलावा, इसे सबक्लासिंग की आवश्यकता है जिसका अर्थ है कि आप मौजूदा नियंत्रणों के लिए इसका उपयोग नहीं कर सकते हैं। – MarqueIV

1

आप नहीं कर सकते AFAIK। आप एक छोटे से वैकल्पिक हल के साथ हालांकि यह कर सकते हैं IsEnabledProperty साथ, और अभी भी। आप इस तरह से अपने खुद के बटन बनाने के लिए है:

संपादित 2013/09/01:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("hello"); 
    } 
} 

public class MyButton : Button 
{ 
    static MyButton() 
    { 
     IsEnabledProperty.OverrideMetadata(typeof(MyButton), 
     new UIPropertyMetadata(true,(o, args) => { },(o, value) => value)); 
    } 
} 

XAML:

<BorderIsEnabled="False"> 
    <wpfApplication2:MyButton Margin="61,95,88,100" Click="ButtonBase_OnClick">Open a new diagram</wpfApplication2:MyButton> 
</Border> 
+0

वास्तव में आप वास्तव में क्या दिखाने की कोशिश कर रहे हैं इसका पालन नहीं कर रहे हैं। प्रतीत होता है कि आपने प्रॉपर्टी चेंज और जर्नल दोनों अज्ञात प्रतिनिधियों को परिभाषित किया है, लेकिन दोनों ही डिफ़ॉल्ट व्यवहार करते हैं, तो उन्हें बिल्कुल निर्दिष्ट क्यों करें? और उस मामले के लिए, आप डिफ़ॉल्ट मान को True पर सेट करते हैं, जो पहले से ही IsEnabled के लिए डिफ़ॉल्ट है, जो सवाल पूछता है कि आप मेटाडेटा को पहले स्थान पर क्यों ओवरराइड कर रहे हैं?फिर, वास्तव में आप जो कुछ हासिल करने की कोशिश कर रहे हैं उसका पालन नहीं कर रहे हैं क्योंकि यह प्रभावी रूप से कुछ भी नहीं बदलता प्रतीत होता है। – MarqueIV

+0

IsEnabledProperty का डिफ़ॉल्ट व्यवहार कंटेनर से अपने बच्चों को अपने मूल्यों को कैस्केड करना है, एक बार जब आप ओवरराइड करते हैं और आप माता-पिता में सेट करते हैं तो IsEnabled = गलत यह बच्चे को प्रभावित नहीं करेगा। – Erez

+0

उम ... लेकिन क्या आप बस कुछ भी उपclass किए बिना बच्चे में IsEnabled को सच में सेट कर सकते हैं? मेरा मतलब है कि यदि आपने कहा है कि IsEnabled का डिफ़ॉल्ट व्यवहार अपने बच्चों द्वारा विरासत में प्राप्त किया जाना है, तो आपको बस इतना करना होगा कि बच्चे को सीधे subclass के बिना, बच्चे पर IsEnabled सेट किया गया है, नहीं? – MarqueIV

संबंधित मुद्दे