WPF

2011-09-28 13 views
13

में ContextMenu मैं WPF में नया हूं, हालांकि मुझे WinForms के साथ कुछ अनुभव है। मैं केवल कई ऑब्जेक्ट्स के लिए ContextMenu जोड़ना चाहता हूं जो मैं गतिशील रूप से बनाता हूं, लेकिन मुझे VS टूलबॉक्स में कोई ContextMenu घटक नहीं मिला।WPF

ContextMenu pMenu = new ContextMenu(); 
MenuItem item1 = new MenuItem(); 
MenuItem item2 = new MenuItem(); 

//I have about 10 items 
//... 
item1.Header = "item1"; 
item1.Click += new RoutedEventHandler(item1_Click); 
pMenu.Items.Add(item1); 

item2.Header = "item2"; 
item2.Click += new RoutedEventHandler(item2_Click); 
pMenu.Items.Add(item2); 

//and so on 

यह काम करता है, हालांकि, WinForms मैं अपने फार्म के लिए ContextMenuStrip घटक ड्रॉप और बहुत जल्दी वस्तुओं और घटनाओं को परिभाषित करने में सक्षम था में w/किसी भी लिख ओ: एक ही रास्ता मैंने पाया इस तरह क्रम में ContextMenu बनाने के लिए है कोड। क्या यह डब्ल्यूपीएफ में संभव है?

उत्तर

29

आप अपने ContextMenu में संसाधनों को परिभाषित करने और आप की जरूरत है किसी भी नियंत्रण करने के लिए इसे बाध्य कर सकते हैं। इस की जाँच करें:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
     <ContextMenu x:Key="MyContextMenu"> 
      <MenuItem Header="Send" /> 
     </ContextMenu> 
    </Window.Resources> 
    <Grid> 
     <Button Name="a_button" 
      ContextMenu="{StaticResource MyContextMenu}" > 
     </Button> 
    </Grid> 
</Window> 
+1

ठीक है, लेकिन मैं वस्तुओं गतिशील बनाने के लिए, तो कैसे क्रम में यह बाध्य करने के लिए? – Mike

+0

@Michael: आप के माध्यम से 'वर pMenu = (ContextMenu) this.Resources [" MyContextMenu "] रनटाइम पर ContextMenu प्राप्त करने में सक्षम होना चाहिए,' तो फिर आप अपने डायनामिक रूप से तैयार नियंत्रित करने के लिए इस चर असाइन कर सकते हैं। – Heinzi

+0

धन्यवाद, यह काम करता है। केवल एक चीज जिसे मैं समझ नहीं पा रहा हूं, क्यों डब्ल्यूपीएफ में मुझे यह जादू करना है और आईडीई में कोई उचित घटक और जीयूआई नहीं है जिससे चीजें ज्यादा आसान हो जाएं। – Mike

11

Additionaly आप MENUITEM पर आदेशों डाल सकते हैं ...

इस तरह:

<MenuItem Header="MyContextMenuItem 
        Command="{Binding Path=MyCommand}" 
        CommandTarget="{Binding 
           RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type DataGrid}}}"> 

CommandTarget बहुत महत्वपूर्ण हो सकता है, यदि आप अलग अलग नियंत्रण पर अपने ContextMenu का उपयोग । मैं अक्सर कॉलर की पहचान करने के लिए FindAncestor का उपयोग करता हूं।

+1

मैं कॉलर प्राप्त करने के लिए प्लेसमेंट लक्ष्य का उपयोग करता हूं – Mike

1

निम्नलिखित कोड मेरे लिए काम करता है, InsertQuery/DeleteQuery दो ICommand तरीकों ViewModel में परिभाषित कर रहे हैं।

<DataGrid.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Insert" 
         Command="{Binding DataContext.InsertQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> 
      <MenuItem Header="Delete" 
         Command="{Binding DataContext.DeleteQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> 
     </ContextMenu> 
    </DataGrid.ContextMenu> 
संबंधित मुद्दे

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