2011-09-28 49 views
13

Tôi mới trong WPF, mặc dù tôi có một số kinh nghiệm với WinForms. Tôi chỉ muốn thêm ContextMenu cho một số đối tượng mà tôi tạo động, nhưng tôi không tìm thấy thành phần ContextMenu trong VS toolbox. Cách duy nhất tôi thấy là tạo ra ContextMenu trong thời gian chạy như thế này:ContextMenu trong 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 

Nó hoạt động, tuy nhiên, trong WinForms tôi đã có thể thả bộ phận ContextMenuStrip mẫu của tôi và xác định các mặt hàng và các sự kiện rất nhanh chóng w/o viết bất kỳ mã. Có thể trong WPF?

Trả lời

29

Bạn có thể xác định ContextMenu tài nguyên của mình và liên kết nó với bất kỳ kiểm soát nào bạn cần. Check this out:

<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, nhưng tôi tạo đối tượng động, vậy làm cách nào để liên kết đối tượng trong thời gian chạy? – Mike

+0

@Michael: Bạn sẽ có thể nhận được ContextMenu khi chạy qua 'var pMenu = (ContextMenu) this.Resources [" MyContextMenu "];' Sau đó, bạn có thể gán biến này cho điều khiển được tạo động của bạn. – Heinzi

+0

Cảm ơn, nó hoạt động. Điều duy nhất tôi không thể hiểu là tại sao trong WPF tôi phải làm tất cả các phép thuật này và không có thành phần thích hợp và GUI trong IDE để làm cho mọi thứ dễ dàng hơn nhiều như họ phải. – Mike

11

Additionaly bạn có thể đặt lệnh trên MenuItem ...

Như thế này:

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

CommandTarget có thể rất quan trọng, nếu bạn sử dụng ContextMenu của bạn trên các điều khiển khác nhau . Tôi thường sử dụng FindAncestor ở đây, để xác định người gọi.

+1

Tôi sử dụng PlacementTarget để có được người gọi – Mike

1

Mã sau hoạt động với tôi, InsertQuery/DeleteQuery là hai phương thức ICommand được định nghĩa trong 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> 
Các vấn đề liên quan