隧道事件和上下文菜单
我有以下 WPF 控件,其行为应该像 GoogleMaps 那样(左双击缩放,右双击取消缩放):
<Grid>
<ScrollViewer x:Name="scrollViewer">
<Canvas x:Name="myCanvas"/>
</ScrollViewer>
</Grid>
和一些代码:
void OnScrollViewerPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//this.myCanvas.ContextMenu = null;
if (e.OriginalSource is Canvas)
{
// zoom on left doubleClick
if (e.ChangedButton == MouseButton.Left)
{
ZoomOnMouseOnce();
} // UNzoom on right doubleClick
else if (e.ChangedButton == MouseButton.Right)
{
UnzoomOnMouseOnce();
}
e.Handled = true;
}
}
问题是当 myCanvas 有 ContextMenu 时,UnZoom 方法不起作用,因为 ScrollViewer 上不再捕获 DoubleClick 事件...
设置 this.myCanvas.ContextMenu = null;
解决了问题,但是有没有办法绕过这个问题?...
I have the following WPF Control, that should behave like, by e.g. GoogleMaps does(zoom on left double click, unzoom on right double click):
<Grid>
<ScrollViewer x:Name="scrollViewer">
<Canvas x:Name="myCanvas"/>
</ScrollViewer>
</Grid>
And some code:
void OnScrollViewerPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//this.myCanvas.ContextMenu = null;
if (e.OriginalSource is Canvas)
{
// zoom on left doubleClick
if (e.ChangedButton == MouseButton.Left)
{
ZoomOnMouseOnce();
} // UNzoom on right doubleClick
else if (e.ChangedButton == MouseButton.Right)
{
UnzoomOnMouseOnce();
}
e.Handled = true;
}
}
The problem is that When myCanvas have a ContextMenu the UnZoom method does not work, because DoubleClick event is not catched anymore on ScrollViewer...
Setting this.myCanvas.ContextMenu = null;
solves the problem, but Is there a way to bypass this?...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
更新
上传了演示效果的小示例项目。
http://www.mediafire.com/?du2jr18khx8ooy9
我为此尝试了很多不同的方法我发现的最接近的事情是将 ContextMenu 的 HorizontalOffset 偏移 1。这允许在上下文菜单打开时右键双击。当 ContextMenu 未打开时它仍然不起作用,因为 ScrollViewer 仅收到第一次单击。
您可以通过使用第一次鼠标右键单击的计时代码来解决此问题,如果在线程耗尽之前再次单击鼠标右键,则可以使用 SendInput 模拟另一次鼠标右键单击。虽然它可能不是那么漂亮,但我完成了工作。
代码隐藏
MouseSimulator.cs
Update
Uploaded small sample project demonstrating the effect.
http://www.mediafire.com/?du2jr18khx8ooy9
I tried a bunch of different approaches for this and the closest thing I found was to offset the HorizontalOffset by 1 for the ContextMenu. This allowed for right-double-click when the ContextMenu was open. It still didn't work when the ContextMenu wasn't open since the ScrollViewer only recieved the first click.
You could work around this by using your timing code for the first right-mouse-click and if another right-mouse-click occurs before the Thread runs out, you simulate another right-mouse-click using SendInput. Although it may not be so pretty, I gets the job done.
Code behind
MouseSimulator.cs