【问题标题】:WPF MouseLeftButtonUp Not FiringWPF MouseLeftButtonUp 未触发
【发布时间】:2010-09-24 00:21:17
【问题描述】:

当我使用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。除非您根据用户按住按钮的时间不同而做出不同的行为。

标签: wpf events button mouseleftbuttonup


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      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

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

      大多数人认为冒泡模型更为自然。 这就是接受的答案有问题的原因。

      【讨论】:

      • P.S. e.Handled 不是您的事件可能不会被触发的唯一原因。另一种可能性是你上游的东西叫做 Mouse.Capture。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多