2013-09-03 4 views
2

안녕하세요, 저는 윈도우 폰 app에서 컨텐트 메뉴를 설정할 필요가 있습니다. 일부 코드를 시도했지만 컨텐트 메뉴가 실행되지 않습니다. 그래서 아무도 내 코드가 작동하지 않는 이유를 말해줍니다. 내 코드가 잘못되었습니다.Windows phone에서 탭/클릭 이벤트로 컨텍스트 메뉴를 설정하는 방법은 무엇입니까?

<Button Width="113" Click="Home" BorderThickness="0" HorizontalAlignment="Left" Height="87" > 
    <Image Source="Images/home_30.png" Stretch="Uniform" VerticalAlignment="Top" Height="66" Width="68" /> 
    <toolkit:GestureService.GestureListener> 
     <toolkit:GestureListener Tap="GestureListener_Tap" /> 
    </toolkit:GestureService.GestureListener> 
    <toolkit:ContextMenuService.ContextMenu> 
     <toolkit:ContextMenu x:Name="menu"> 
       <toolkit:MenuItem Header="Add"/> 
       <toolkit:MenuItem Header="Update"/> 
       <toolkit:MenuItem Header="Delete"/> 
     </toolkit:ContextMenu> 
    </toolkit:ContextMenuService.ContextMenu> 
    </Button> 

내 C# 코드

private void GestureListener_Tap(object sender, GestureEventArgs e) 
    { 
     Button button = sender as Button; 
     ContextMenu contextMenu = ContextMenuService.GetContextMenu(button); 
     if (contextMenu.Parent == null) 
     { 
      contextMenu.IsOpen = true; 
     } 
    } 

이 코드를 사용하고 있지만, 메뉴 버튼이 실행되지 않습니다

내 코드는 아래와 같습니다.

+1

당신이하고 싶은 것을 잘 모르지만 귀하의 MenuItems에서 클릭/탭하지 않아야합니까? ? – robertk

답변

1

당신은 뒤에 당신의 코드에

<toolkit:MenuItem x:Name="Copy" Header="Copy" Click="Copy_Click"/> 

같은 것을 시도하십시오 MenuItem을

에 대한 Click 이벤트를

private void Copy_Click(object sender, RoutedEventArgs e) 
     { 
       //handle the event here 
     } 
+0

안녕하세요. 회신 해 주셔서 감사합니다. 이것이 나를 위해 매우 유용하게되기를 바랍니다. – user123

0
당신이 하나의 개체가있을 때 Rithesh Baradi 게시 무엇

가 정확한지 상황에 맞는 메뉴를 넣을 수도 있지만, 상황에 맞는 메뉴가 목록에 적용될 때 그다지 편리하지 않을 수도 있습니다. Windows Phone Toolkit에서 다음과 같은 솔루션을 고려 (편의상 난 단지 하나 개의 명령을했다) :

<toolkit:ContextMenuService.ContextMenu> 
    <toolkit:ContextMenu> 
     <toolkit:MenuItem Header="Header1" Command="{Binding Header1Command}"/> 
    </toolkit:ContextMenu> 
</toolkit:ContextMenuService.ContextMenu> 

코드를 뒤에 뷰 모델에 :

public partial class MainPage : PhoneApplicationPage 
    { 
     ViewModel _viewModel; 

     public ContextMenuSample() 
     { 
      InitializeComponent(); 
      _viewModel = new ViewModel(); 
      _viewModel.Notify += OnViewModelNotify; 
      LayoutRoot.DataContext = _viewModel; 
     } 

     void OnViewModelNotify(object sender, CommandEventArgs e) 
     { 
      Debug.WriteLine(string.Format("ICommand: {0}", e.Message)); 
     } 

     private void MenuItem_Click(object sender, RoutedEventArgs e) 
     { 
      Debug.WriteLine((string)((MenuItem)sender).Header); 
     } 
    } 

    public class CommandEventArgs : EventArgs 
    { 
     public CommandEventArgs(string message) 
     { 
      Message = message; 
     } 

     public string Message { get; private set; } 
    } 

    public class ViewModel 
    { 
     public ICommand Header1Command { get; private set; } 

     public event EventHandler<CommandEventArgs> Notify; 

     public ViewModel() 
     { 
      Header1Command= new Header1ICommand(); 
      ((Header1ICommand)Header1Command).Notify += OnNotify; 
     } 

     private void OnNotify(object sender, CommandEventArgs e) 
     { 
      var notify = Notify; 
      if (notify != null) 
      { 
       notify(this, e); 
      } 
     } 
    } 

    public class Header1ICommand: ICommand 
    { 
     public bool CanExecute(object parameter) 
     { 
      return true; 
     } 
     public event EventHandler CanExecuteChanged; 
     public void Execute(object parameter) 
     { 
      var unused = CanExecuteChanged; 
      var notify = Notify; 
      if (notify != null) 
      { 
       notify(this, new CommandEventArgs("Header1ICommand- " + (parameter ?? "[null]"))); 
      } 
     } 
     public event EventHandler<CommandEventArgs> Notify; 
    } 

대안 솔루션 ICommand의 MVVM Light Toolkit에 - RelayCommand. 많은 예제가 있지만 ICommands와 거의 같은 방식으로 작동합니다. 코드를 적게 작성해야하기 때문에 더 간단합니다! 자신에게 가장 적합한 것을 선택하십시오.

최종 참고 사항 : ContextMenuDataContext이 나머지 요소 (텍스트 블록 등)에서 변경되지 않는 곳에 문제가 있었기 때문에 ContextMenu를주의해야합니다.

관련 문제