我正在使用WPF设计一个无边框的可移动应用程序窗口。
为了手动执行拖放窗口的功能,我向<Window>
元素添加了一个OnMouseDown事件,该元素执行相应的C#函数(this.DragMove()
)。
此外,我需要一个<Image>
按钮来允许一些操作(这次使用OnMouseUp事件)。请注意,它必须是Image标签,而不是Button。
不幸的是,只有在单击鼠标右键时才会触发Image事件,这可能是因为左键按住了窗口事件。我是对的吗?
当有人点击图片按钮时,我只想触发Image事件。我该怎么办?
答案 0 :(得分:1)
因为WPF冒泡和隧道事件。所以你能做的就是每当你处理事件按钮时使用冒泡,这意味着你可以为按钮和窗口使用预览事件,每当你只想处理按钮事件时,然后在按钮点击的最后一行代码后写下来像这样。
e.handled=true;
//这里e是您将在预览事件中获得的事件参数。现在窗口拖动事件将无效。
我建议首先清楚在wpf中冒泡(预览鼠标事件)和隧道的想法。
Difference between Bubbling and Tunneling events
并通过一些鼓泡和隧道的例子。你会得到更好的主意。
http://www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events
答案 1 :(得分:1)
您遇到的问题很可能与event routing有关。这个想法是,如果你的处理程序没有将事件标记为Handled
,它将被路由到下一个侦听器,除非到达链的末尾或者一个侦听器/处理程序将其设置为Hadnled
。
因此,如果MouseDown
和Window
都有Image
事件处理程序,请注意路由将在您设置e.Handled = true;
时停止:< / p>
private void Window_OnMouseDown(object sender, KeyEventArgs e)
{
e.Handled = false; // will NOT break event chain;
}
您随时可以检查发件人的类型,以便您可以区分Image
和Window
个不同的事件:
private void Image_OnMouseDown(object sender, KeyEventArgs e)
{
if (sender is Image)
{
// Handle Image.MouseDown
e.Handled = true; // we don't need to push event further;
}
}