15

当我使用该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>

我知道这很可能很简单。谢谢您的帮助!

4

3 回答 3

30

看起来Button控制正在吞噬该事件,因为Button.Click实际上是LeftButtonDown事件和LeftButtonUp事件的组合。

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

于 2008-11-25T18:01:21.960 回答
5

订阅隧道事件而不是气泡事件有一些非常混乱的副作用,我将在后面解释。

这是一个更好的解决方案,因为它可以保持您的气泡完好无损。:)

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

在孩子之前为父母举办隧道活动。冒泡 - 相反。如果您涉及许多事件处理程序,您应该真正坚持所有冒泡或所有隧道,否则您添加的事件处理程序越多,它就越混乱 - 添加一个新的事件处理程序可能会导致您重新访问应用程序中的所有其他事件处理程序。

大多数人发现冒泡模型更自然。这就是为什么接受的答案是有问题的。

于 2018-05-09T22:56:40.467 回答
3

ButtonHandled正在为其事件使用 Mouse[Left/Right]Button[Up/Down] 事件(并将它们标记为) Button.Click

正如Jobi 所说,您可以使用PreviewMouseLeftButtonUp事件,但我想建议您创建自己的按钮模板并修改其行为。(即不标记MouseLeftButtonUpas Handled = true)或仅使用 a 以外的其他东西Button作为您的父容器(取决于您真正需要它的用途)。

于 2011-08-03T21:11:31.043 回答