2011-09-28 5 views
13

WinForms에 대한 경험이 있지만 WPF가 새로 도입되었습니다. 동적으로 생성 한 여러 객체에 대해 ContextMenu를 추가하려고하지만 VS 도구 상자에 ContextMenu 구성 요소가 없습니다. 그것은 w/어떤을 작성 O를 내가 내 양식에 ContextMenuStrip을 구성 요소를 삭제하고 매우 빠르게 아이템과 이벤트를 정의 할 수 있었다 윈폼에서, 그러나, 작동WPF의 ContextMenu

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 

: 내가 발견하는 유일한 방법은 다음과 같이 런타임에서의 ContextMenu를 만드는 것입니다 암호. WPF에서 가능합니까?

답변

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 : 당신은'var pMenu = (ContextMenu) this.Resources [ "MyContextMenu"];'를 통해 런타임에 ContextMenu를 얻을 수 있어야합니다. 그러면이 변수를 동적으로 생성 된 컨트롤에 할당 할 수 있습니다. – Heinzi

+0

감사합니다. 작동합니다. 내가 이해할 수없는 유일한 이유는 WPF에서이 모든 마법을 수행해야하며 IDE에 적절한 구성 요소와 GUI가 없기 때문에 훨씬 쉽게 작업을 수행 할 수 있다는 것입니다. – Mike

11

가 Additionaly 당신이는 menuItem에 명령을 넣을 수 있습니다 ...이처럼

을 :

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

서로 다른 컨트롤에 contextMenu를 사용하는 경우 CommandTarget은 매우 중요 할 수있다 . 여기서 FindAncestor를 사용하여 호출자를 식별합니다.

+1

나는 PlacementTarget을 사용하여 호출자를 얻습니다. – Mike

1

다음 코드는 나를 위해 작동합니다. InsertQuery/DeleteQuery는 ViewModel에 정의 된 두 가지 ICommand 메서드입니다.

<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>