[英]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.