繁体   English   中英

选择项目后,如何防止WP7上下文菜单关闭?

[英]How can I prevent a WP7 context menu from closing after an item has been selected?

我已经将上下文菜单项连接到列表框项中,因此点击它会更改其状态。 我需要菜单在选定项目后保持打开状态,或者需要在菜单关闭后以编程方式重新打开菜单。

我的菜单如下所示:

Some Command 1
Some Command 2
Some Command 3
Inverted

用户可以点击“ Inverted命令,然后点击其他命令之一,使它们在“反转模式”下运行,通过数据绑定的菜单如下所示:

Some Command 1
Some Command 2
Some Command 3
Inverted ✔ 

无法弄清楚如何在点击后保持菜单打开,我尝试了不太理想的重新打开菜单方法,如下所示:

private void onCommandInvert(object sender, RoutedEventArgs e)
{
  CommandState.Instance.Inverted = !CommandState.Instance.Inverted;

  // Open it again.
  MenuItem menuItem = (MenuItem)sender;
  ContextMenu menu = (ContextMenu)menuItem.Parent;
  menu.IsOpen = true;
}

但是这样做会在menu.IsOpen = true上引发以下异常menu.IsOpen = true语句:

A first chance exception of type 'System.InvalidOperationException' occurred in 
  System.Windows.dll

An unhandled exception of type 'System.InvalidOperationException' occurred in 
  System.Windows.dll

Additional information: Element is already the child of another element.

我还尝试了Closed事件进行以下操作,但发生了相同的异常:

private void onContextMenuClosed(object sender, RoutedEventArgs e)
{
  ContextMenu menu = (ContextMenu)sender;
  menu.IsOpen = true;
}

有任何想法吗? 谢谢!

我知道了! 感谢willmel的评论,我浏览了MenuItem的源代码,并且能够重写OnClick()来精确地执行我需要的操作(毫无疑问是理想的解决方案)。 但是,我无法访问Click ,因此还需要引入StayClick事件属性。

请享用!

using Microsoft.Phone.Controls;
using System.Windows;

namespace MyNamespace
{
  public class MenuItemEx : MenuItem
  {
    public bool StayOpenWhenClicked
    {
      get;
      set;
    }

    public event RoutedEventHandler StayClick;

    protected override void OnClick()
    {
      if (StayOpenWhenClicked)
      {
        if (StayClick != null)
        {
          StayClick.Invoke(this, new RoutedEventArgs());
        }
      }
      else
      {
        base.OnClick();
      }
    }
  }
}

并在页面的xaml中,使用my:MenuItemEx而不是toolkit:MenuItem my:MenuItemEx

<my:MenuItemEx 
  Header="Inverted"             
  StayClick="onCommandInvert"
  StayOpenWhenClicked="True"
/>

如果您要在用户选择一个项目后保留菜单,那么我相信上下文菜单控件不是您应该使用的菜单控件。

更好的是,您应该创建自己的用户控件来模仿该行为,并将其适当地放置在有意义的屏幕上(侧面或上方/下方)

或者,如果这些是要在选定项目上执行的选项,请考虑使用应用程序栏图标/菜单项并编写事件代码以读取列表框项目的当前选定值。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM