2011-09-28 22 views
13

Jestem nowy w WPF, choć mam pewne doświadczenie z WinForm. Chcę tylko dodać ContextMenu dla kilku obiektów, które tworzę dynamicznie, ale nie znalazłem elementu ContextMenu w przyborniku VS. Jedynym sposobem, znalazłem jest stworzenie ContextMenu w czasie wykonywania tak:Menu kontekstowe w 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 

Działa on jednak w WinForms udało mi się upuścić element ContextMenuStrip do mojej postaci i bardzo szybko określić przedmioty i zdarzenia w/o pisanie dowolny kod. Czy jest to możliwe w WPF?

Odpowiedz

29

Możesz zdefiniować swoje zasoby w ContextMenu i powiązać je z dowolną potrzebną kontrolą. Sprawdź to:

<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

Ok, ale tworzę obiekty dynamicznie, więc jak je powiązać w czasie wykonywania? – Mike

+0

@Michael: Powinieneś być w stanie uzyskać ContextMenu w czasie wykonywania poprzez 'var pMenu = (ContextMenu) this.Resources [" MyContextMenu "];' Następnie możesz przypisać tę zmienną do dynamicznie tworzonego kontrolki. – Heinzi

+0

Dzięki, to działa. Jedyne, czego nie mogę zrozumieć, to dlaczego w WPF muszę robić całą tę magię i nie ma odpowiedniego komponentu i GUI w IDE, aby rzeczy były łatwiejsze, niż muszą. – Mike

11

Dodatkowo można umieścić polecenia na MENUITEM ...

tak:

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

CommandTarget może być bardzo ważne, jeśli używasz contextMenu na różnych kontroli . Często używam FindAncestor tutaj, aby zidentyfikować dzwoniącego.

+1

Używam PlacementTarget, aby uzyskać dzwoniącego – Mike

1

Poniższy kod działa dla mnie, InsertQuery/DeleteQuery to dwie metody ICommand zdefiniowane w 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> 
Powiązane problemy