gpt4 book ai didi

.net - 调用上下文菜单打开

转载 作者:行者123 更新时间:2023-12-02 07:35:49 26 4
gpt4 key购买 nike

我需要做一些像 Google map 那样的事情(但是在 WPF 中):

  • 当在 map 上右键单击时,我有一个上下文菜单。
  • RightDoubleClicking时,我有UnZoom操作。

所以,显然,这在 WPF 中有点困难......经过一番努力和搜索后,读到人们提示“我们无法预测 future ”(我问自己 Google 如何预测 future ),我决定“等待”SystemInformation.DoubleClickTime 并且只然后显示上下文菜单。

当然,这并不理想,甚至是人类可观察到的,但我不知道其他方法。

所以,我对以下代码遇到的问题是(我有一个自定义 Canvas ):

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 元素打开,并始终打开父( Canvas )contextMenu。

我可以只调用 contextMenu 事件吗?

最佳答案

我对 WPF 不太了解,但是您能否显示菜单(例如,距光标一个像素),并查看用户是否在同一位置以及在系统双击时间内再次右键单击?我曾经在游戏中使用过类似的技术,而且效果很好。
菜单“淡入”(也可以选择淡出)动画可以使其变得更好。

关于.net - 调用上下文菜单打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4492996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com