2

嗨,我需要在 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;
        }
    }

我正在使用此代码,但菜单按钮不会触发。

4

2 回答 2

1

您有 MenuItem 的 Click 事件

请尝试这样的事情

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

在你后面的代码

private void Copy_Click(object sender, RoutedEventArgs e)
        {
               //handle the event here
        }
于 2013-09-03T17:08:51.327 回答
0

当您有一个对象并为其放置上下文菜单时,Rithesh Baradi 发布的内容是正确的,但当上下文菜单应用于列表时可能就不那么方便了。考虑以下来自Windows Phone Toolkit的解决方案(为简单起见,我只使用了一个命令):

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

ViewModel 中的代码:

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 的工作方式几乎相同 - 它更简单,因为您必须编写更少的代码!选择最适合您的。

最后注意事项:小心使用 ContextMenu,因为之前我遇到了一些问题,而其他元素(文本块等)DataContextContextMenu不会改变。

于 2013-09-04T06:09:07.067 回答