XAML Window MouseDown事件击败图像事件

时间:2014-07-07 09:32:35

标签: wpf xaml

我正在使用WPF设计一个无边框的可移动应用程序窗口。

为了手动执行拖放窗口的功能,我向<Window>元素添加了一个OnMouseDown事件,该元素执行相应的C#函数(this.DragMove())。

此外,我需要一个<Image>按钮来允许一些操作(这次使用OnMouseUp事件)。请注意,它必须是Image标签,而不是Button。

不幸的是,只有在单击鼠标右键时才会触发Image事件,这可能是因为左键按住了窗口事件。我是对的吗?

当有人点击图片按钮时,我只想触发Image事件。我该怎么办?

2 个答案:

答案 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

因此,如果MouseDownWindow都有Image事件处理程序,请注意路由将在您设置e.Handled = true;时停止:< / p>

private void Window_OnMouseDown(object sender, KeyEventArgs e)
{
    e.Handled = false; // will NOT break event chain;
}

您随时可以检查发件人的类型,以便您可以区分ImageWindow个不同的事件:

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;
    }
}