WPF MouseLeftButtonUp事件未触发

18
当我使用MouseUp事件时,可以通过鼠标右键单击来触发它。但是MouseLeftButtonUp无论哪种点击方式都不会触发它!
<Button MouseLeftButtonUp="btnNewConfig_MouseUp"  Name="btnNewConfig">
    <StackPanel Orientation="Horizontal">
        <Image Source="Icons\new.ico" Height="24" Width="24" Margin="5"/>
        <TextBlock VerticalAlignment="Center">New</TextBlock>
    </StackPanel>
</Button>

我知道这可能是一些简单的事情。感谢您的帮助!


由于问题涉及到一个按钮,且仅与一个事件关联,我想说您可能只需要使用它的“Click”事件而非“MouseLeftButtonUp”或“MouseLeftButtonDown”事件。除非您正在进行一些奇特的操作,例如根据用户长按按钮的时间来实现不同的行为。 - ILIA BROUDNO
3个回答

32

看起来 Button 控件正吃掉了那个事件,因为 Button.Click 实际上是 LeftButtonDown 事件和 LeftButtonUp 事件的组合。

但你可以在 Button 上订阅隧道事件 PreviewMouseLeftButtonUp 而不是 LeftButtonUp


8
订阅隧道事件而不是冒泡事件会产生一些混乱的副作用,稍后我将解释。以下是更好的解决方案,它可以保持您的冒泡完整。 :)
btnNewConfig.AddHandler(MouseLeftButtonUpEvent, 
                        new RoutedEventHandler(btnNewConfig_MouseUp), 
                        true);

您需要使用RoutedEventArgs来声明事件处理程序,而不是MouseButtonEventArgs,但您可以在内部将其强制转换回MouseButtonEventArgs

void btnNewConfig_MouseUp(object sender, RoutedEventArgs e)
{
    MouseButtonEventArgs args = e as MouseButtonEventArgs;
    // ...
}

请注意 AddHandler 中的最后一个参数 - 将其设置为 true 可以使您的事件即使先前的处理程序设置了 e.Handled = true; 也会触发。

现在让我们谈谈 PreviewMouseLeftButtonUp:

隧道事件在子元素之前向父级元素触发。冒泡事件则相反。 如果涉及许多事件处理程序,则应该坚持全部冒泡或全部隧道,否则添加更多事件处理程序将使情况越来越混乱 - 添加一个新的事件处理程序可能会导致您重新访问应用程序中的所有其他处理程序。

大多数人发现冒泡模型更加自然。 这就是为什么被接受的答案存在问题的原因。


1
P.S. e.Handled 不一定是你的事件无法触发的唯一原因。另一个可能性是你上游的某个东西叫做 Mouse.Capture。 - ILIA BROUDNO
你应该坚持使用全部冒泡排序或全部隧道排序,这是我的情况。 - Muhammad Sulaiman

4

按钮使用鼠标的[左/右]键[按下/释放]事件(并将它们标记为Handled)来触发其Button.Click事件。

正如Jobi所说,您可以使用PreviewMouseLeftButtonUp事件,但我建议您创建自己的按钮模板并修改其行为。(即不将MouseLeftButtonUp标记为Handled = true),或者仅使用其他内容作为您的父容器(取决于您实际需要什么)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接