代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

wpf mouseleftbuttonup未启动

  •  11
  • Adam Driscoll  · 技术社区  · 16 年前

    WPF发生了奇怪的事情…当我将事件设置为mouseup时,我可以在右键单击按钮时将其激发。但这两种点击都不会触发!

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

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

    3 回复  |  直到 6 年前
        1
  •  25
  •   Jobi Joy    16 年前

    看来Button控件正在占用该事件,因为Button。Click实际上是LeftButtonDown事件和LeftButtonUp事件的组合。

    但是你可以订阅隧道事件 预览鼠标松开按钮向上 在按钮上得到左按钮

        2
  •  2
  •   matfillion    13 年前

    按钮使用鼠标左键/右键向上/向下事件(并将其标记为“已处理”)作为其按钮。单击事件。

    正如Jobi所说,您可以使用PreviewMouseLeftButtonup事件,但我想建议您创建自己的按钮模板并修改其行为。(即,不将mouseLeftButtonUp标记为handled=true)或只使用按钮以外的其他内容作为父容器。(取决于你真正需要它做什么)。

        3
  •  0
  •   ILIA BROUDNO    6 年前

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

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

    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:
    隧道事件在孩子们之前就为父母点燃了火。冒泡-相反。 如果您涉及到许多事件处理程序,那么您应该坚持使用所有冒泡或所有隧道式处理程序,否则添加的事件处理程序越多,它就越容易混淆——添加一个新的事件处理程序可能会导致您重新访问应用程序中的所有其他事件处理程序。
    大多数人认为冒泡模型更自然。 这就是为什么接受的答案是有问题的。