7

我有一个在 XAML 中声明的按钮,它具有 MouseDown 和 MouseUp 属性,它们都调用指定的方法......

<Button x:Name="btnBackward" Content="Backward"
        MouseDown="btnBackward_MouseDown" 
        MouseUp="btnBackward_MouseReleased" Width="50" Height="25" 
        Margin="65,400,377,45"/>

但是,永远不会调用 btnBackward_MouseReleased 方法。

private void btnBackward_MouseReleased(object sender, 
                                       System.Windows.Input.MouseEventArgs e)
{
    Console.WriteLine("mousereleased");
    this.isRewinding = false;
}

我错过了什么?

4

1 回答 1

14

你应该Preview events在这里使用。所以,而不是MouseDownand MouseUp,挂钩到PreviewMouseDownand PreviewMouseUp

<Button x:Name="btnBackward" Content="Backward"
        PreviewMouseDown="btnBackward_MouseDown" 
        PreviewMouseUp="btnBackward_MouseReleased"/>

原因表MSDN -

Button 抑制由 Button 或其复合元素引发的 MouseLeftButtonDown 和 MouseLeftButtonDown 冒泡事件,以便捕获鼠标并引发始终由 Button 本身引发的 Click 事件。事件及其数据仍沿路径继续,但由于 Button 将事件数据标记为已处理,因此仅调用专门指示它们应在handledEventsToo 情况下执行的事件的处理程序。如果您的应用程序根部的其他元素仍然希望有机会处理受控制的事件,则另一种方法是在代码中附加处理程序,并将handledEventsToo 指定为true。但通常更简单的技术是将您处理的路由方向更改为输入事件的预览等效项。例如,如果控件禁止 MouseLeftButtonDown,请尝试为 PreviewMouseLeftButtonDown 附加处理程序

但是,如果您右键单击按钮MouseUpMouseDown事件将完美运行,因为在这种情况下单击不会占用事件并且它们会正确冒泡。

于 2013-08-21T18:07:11.457 回答