2011-09-28 25 views
13

Soy nuevo en WPF, aunque tengo cierta experiencia con WinForms. Solo quiero agregar ContextMenu para varios objetos que creo dinámicamente, pero no encontré ningún componente ContextMenu en la caja de herramientas de VS. La única manera que he encontrado es crear ContextMenu en tiempo de ejecución de la siguiente manera:ContextMenu en 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 

Funciona, sin embargo, en WinForms yo era capaz de soltar componente ContextMenuStrip a mi forma y definir objetos y eventos muy rápidamente w/o escribir cualquier código. ¿Es posible en WPF?

Respuesta

29

Puede definir su ContextMenu en recursos y vincularlo a cualquier control que necesite. Mira esto:

<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, pero creo objetos dinámicamente, entonces, ¿cómo enlazarlos en tiempo de ejecución? – Mike

+0

@Michael: Debería poder obtener el ContextMenu en tiempo de ejecución a través de 'var pMenu = (ContextMenu) this.Resources [" MyContextMenu "];' Luego puede asignar esta variable a su control creado dinámicamente. – Heinzi

+0

Gracias, funciona. Lo único que no puedo entender es por qué en WPF tengo que hacer toda esta magia y no hay un componente apropiado y GUI en IDE para hacer las cosas mucho más fáciles, como deben ser. – Mike

11

Adicionalmente se puede poner comandos en el menuItem ...

De esta manera:

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

CommandTarget puede ser muy importante, si usted utiliza su contextMenu en diferentes controles . A menudo uso FindAncestor aquí, para identificar a la persona que llama.

+1

Uso PlacementTarget para obtener la persona que llama – Mike

1

El siguiente código funciona para mí, InsertQuery/DeleteQuery son dos métodos de ICommand definidos en 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> 
Cuestiones relacionadas