我需要像Google那样做一些事情(但在WPF中):
RightClick在地图上我有一个ContextMenu。当RightDoubleClicking I‘s UnZoom的动作所以,很显然,这在WPF中有点困难.在经历了大量的挣扎和搜索之后,读到了那些认为“我们无法预测未来”的人(我问自己谷歌是如何预测未来的),我决定“等待”SystemInformation.DoubleClickTime,然后再显示一个contextMenu。
当然,这不是理想的,甚至是人类可以观察到的,但我不知道其他的方法。
因此,下面代码的问题是(我有一个自定义画布):
ContextMenuEventArgs lastContextMenuEventArgs = null;
bool? lastContextMenuEventArgsHandled = null;
protected override void OnContextMenuOpening(ContextMenuEventArgs e)
{
lastContextMenuEventArgs = e;
lastContextMenuEventArgsHandled = e.Handled;
e.Handled = true;
//base.OnContextMenuOpening(e);
}
bool rightMouseClickedOnce = false;
protected override void OnPreviewMouseRightButtonUp(MouseButtonEventArgs e)
{
//base.OnPreviewMouseRightButtonUp(e);
Console.WriteLine(">>>>>>>>>>> OnPreviewMouseRightButtonUp");
if (!rightMouseClickedOnce)
{
rightMouseClickedOnce = true;
Thread thread = new Thread(
new System.Threading.ThreadStart(
delegate()
{
Thread.Sleep(System.Windows.Forms.SystemInformation.DoubleClickTime);
this.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Background,
new Action(
delegate()
{
if (rightMouseClickedOnce)
{
Console.WriteLine(">>>>>>>>>>> Right Click");
rightMouseClickedOnce = false;
base.OnPreviewMouseRightButtonUp(e);
if (lastContextMenuEventArgsHandled.HasValue)
{
Console.WriteLine(">>>>>>>>>>> lastContextMenuEventArgsHandled");
lastContextMenuEventArgs.Handled = lastContextMenuEventArgsHandled.Value;
base.OnContextMenuOpening(lastContextMenuEventArgs);
lastContextMenuEventArgsHandled = null;
}
//if (this.ContextMenu != null)
//{
// this.ContextMenu.PlacementTarget = this;
// this.ContextMenu.IsOpen = true;
//}
}
}
));
}
));
thread.Start();
}
else if (rightMouseClickedOnce)
{
Console.WriteLine(">>>>>>>>>>> Right Double Click");
rightMouseClickedOnce = false;
base.OnPreviewMouseRightButtonUp(e);
this.OnMouseRightDoubleClick(e);
}
}一切都很好,但有一个小问题:base.OnContextMenuOpening(lastContextMenuEventArgs);似乎不工作.
我以前就开始
if (this.ContextMenu != null)
{
this.ContextMenu.PlacementTarget = this;
this.ContextMenu.IsOpen = true;
}这起作用了,但最后这阻止了子contextMenu元素的打开,并且始终打开父(画布) contextMenu。
我可以直接调用contextMenu事件吗?
发布于 2010-12-20 19:32:10
我对WPF不太了解,但是你能显示菜单吗,比如说,在离光标一个像素的地方,看看用户是否在同一地点和系统双击时间再次右击?我曾在一场比赛中使用过类似的技术,而且表现得相当不错。
菜单“淡入”(也可以选择退出)动画可以使它更好。
https://stackoverflow.com/questions/4492996
复制相似问题