2011-09-28 33 views
13

WinPorms ile biraz deneyimim olsa da, WPF'de yeniyim. Dinamik olarak oluşturduğum birkaç nesne için ContextMenu eklemek istiyorum, ancak VS araç kutusunda hiçbir ContextMenu bileşeni bulunamadı. Bu w/herhangi yazma o benim forma ContextMenuStrip bileşeni bırakın ve çok hızlı bir şekilde öğeleri ve olayları tanımlamak başardı WinForms Ancak işlerContextMenu

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 

: buldum tek yolu böyle çalışma zamanında ContextMenu yaratmaktır kodu. WPF'de mümkün mü?

cevap

29

ContextMenu kaynağınızı tanımlayabilir ve gereksinim duyduğunuz tüm denetimlere bağlayabilirsiniz. Bu kontrol edin:

<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

Tamam, ancak dinamik olarak nesneler oluşturuyorum, bu nedenle çalışma zamanında nasıl bağlanırım? – Mike

+0

@Michael: ContextMenu'yu çalışma zamanında 'var pMenu = (ContextMenu) yoluyla alabilirsiniz.Resources ["MyContextMenu"]; 'Sonra bu değişkeni dinamik olarak oluşturulmuş kontrolünüze atayabilirsiniz. – Heinzi

+0

Teşekkürler, işe yarıyor. Anlayamadığım tek şey, WPF'de neden tüm bu sihiri yapmam gerektiğidir ve IDE'de olması gerektiği gibi işleri kolaylaştırmak için uygun bir bileşen ve GUI yoktur. – Mike

11

Additionaly sen menuItem üzerinde komutları koyabilirsiniz ... Bu gibi

:

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

farklı kontroller üzerinde contextMenu kullanırsanız CommandTarget, çok önemli olabilir . Arayanı tanımlamak için sık sık FindAncestor'ı kullanırım.

+1

Arayanı almak için PlacementTarget kullanıyorum – Mike

1

Aşağıdaki kod benim için çalışır, InsertQuery/DeleteQuery, ViewModel'de tanımlanan iki ICommand yöntemidir.

<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> 
İlgili konular