2014-04-11 13 views
11

प्रति this page पर क्या क्लिक किया जाता है, ड्रॉपडाउनबटन आइटम्ससोर्स को प्रदर्शित करने के लिए कॉन्टेक्स्टमेनू का उपयोग कर रहा है। हम कैसे जान सकते हैं कि उपयोगकर्ता किस पर क्लिक करता है? बटन पर क्लिक ईवेंट मेनू के लिए नहीं है, लेकिन बटन स्वयं ही है। मैं इस पर कोई अन्य घटना नहीं देखता हूं।ड्रॉपडाउन बटन

+0

इन घटनाओं की जांच करें: 'ड्रॉपडाउन ओपन/ड्रॉपडाउन क्लोज़ड', 'कॉन्टेक्स्टमेनू ओपनिंग/कॉन्टेक्स्टमेनूक्लिंग'। –

+0

WPF में ईवेंट का उपयोग न करें। संभावना है कि नियंत्रण में 'चुनीItem' प्रॉपर्टी है, या- आप' प्रत्येक 'आइटम को' आदेश 'नियमित रूप से' मेनू 'में असाइन कर सकते हैं। –

+0

@ हाईकोर: ड्रॉपडाउन बटन, उद्धरण: 'यह नियंत्रण स्प्लिट बटन के रूप में लगभग कुछ अंतरों के समान है: इसमें कोई चयनित इटैम और चयनित इंडेक्स गुण नहीं हैं और इसमें कोई चयन चेंज इवेंट नहीं है।' –

उत्तर

0

ContextMenu/DropDownButton (जिसे भी आप पसंद करते हैं) में attached property बनाएं। यदि आपने ड्रॉपडाउन किया है तो उस संदर्भ मेनू को प्राप्त करें जो यह दिखा रहा है, उसके बाद Click ईवेंट को हुक अप करें और मान को वापस संपत्ति पर धक्का दें।

3

आप नियंत्रण के लिए आइटम टेम्पलेट ओवरराइड कर सकते हैं और इस तरह से इसके अंदर एक हैंडलर जोड़ सकते हैं:

<controls:DropDownButton Content="Select me" x:Name="selectMeDropDownButton"> 
    <controls:DropDownButton.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" MouseDown="selectMeDropDownButton_TextBlock_MouseDown" /> 
     </DataTemplate> 
    </controls:DropDownButton.ItemTemplate> 
</controls:DropDownButton> 

और ईवेंट हैंडलर में इस तरह कोड-पीछे फ़ाइल को लागू:

void selectMeDropDownButton_TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Left && this.selectMeDropDownButton.IsExpanded) 
    { 
     var value = ((TextBlock)e.Source).DataContext; 
     // Do something meaningful with the value, it's an item from ItemsSource 
    } 
} 

DropDownButton.IsExpanded के लिए चेक आवश्यक है क्योंकि ItemTemplate को Content पर बटन पर ही लागू किया गया है। बेशक आप किसी भी Control/UIElement के साथ टेक्स्टब्लॉक को प्रतिस्थापित कर सकते हैं।

+0

आईएमओ ' 'में' 'के बजाय' 'का उपयोग करना बेहतर है। – xmedeko

14

मैं इस प्रश्न में एक ही जवाब की तलाश में आया था। मैंने कभी भी कुछ भी ऑनलाइन नहीं पाया लेकिन इस समाधान को अपने आप खोज लिया। शायद यह भविष्य में किसी की मदद करेगा।

जैसा कि पहले बताया गया है DropDownButton प्रदर्शित करने के लिए ContextMenu का उपयोग करता है। असल में जो मैं खोज रहा था वह एक बटन से आने वाला "मेनू-जैसी" ड्रॉप डाउन था। उदाहरण के लिए, कहें कि आपके पास DropDownButton है जो "जोड़ें" कहता है। शायद आप 2 विकल्प चाहते हैं जैसे "नया जोड़ें" और "मौजूदा जोड़ें"। तो मैंने यही किया ...

सबसे पहले मैंने हेडर/सामग्री और कमांड को पकड़ने के लिए कुछ ऑब्जेक्ट बनाया।

public class TitledCommand 
{ 
    public String Title { get; set; } 
    public ICommand Command { get; set; } 
} 

सैद्धांतिक रूप से आप DropDownButton की ItemsSource करने के लिए बाध्य करने के लिए इन की एक सूची के लिए होगा।

public List<TitledCommand> TitledCommmands { get; private set; } 

अब हम सिर्फ आइटम कंटेनर शैली के लिए DropDownButton तो यह ItemsSource में हमारे वस्तुओं से शीर्ष लेख और आदेश को चुनता है।

xmlns:metroControls="http://metro.mahapps.com/winfx/xaml/controls" 

और यहाँ शैली है ...

<metroControls:DropDownButton Content="Add" ItemsSource="{Binding Path=TitledCommmands}"> 
    <metroControls:DropDownButton.ItemContainerStyle>   
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding Path=Title}"/> 
      <Setter Property="Command" Value="{Binding Path=Command}"/> 
     </Style>   
    </metroControls:DropDownButton.ItemContainerStyle> 
</metroControls:DropDownButton> 
+1

'<सेटर प्रॉपर्टी =" हैडर "वैल्यू =" {बाध्यकारी पथ = शीर्षक} "/>' का उपयोग नहीं कर रहा था, और डिस्प्ले मेम्बरपाथ एट्रिब्यूट बेहतर था, लेकिन आप लाइफसेवर हैं;) – kwesolowski

+1

इसे स्वीकार किया जाना चाहिए जवाब। –

+0

अच्छी तरह से किया गया! thx – petric

-1

उपयोग SplitButton बजाय DropDownButton:

MahApps शामिल करें। पहले चयन चयन घटना है।

+2

हां लेकिन उनके पास क्लिक होने पर वही अनुभव नहीं है ... – petric

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