【问题标题】:MouseLeftButtonDown handler never called从未调用过 MouseLeftButtonDown 处理程序
【发布时间】:2013-11-12 15:28:39
【问题描述】:

我正在努力解决一个让我发疯的问题。

这是我的 XAML 代码(简化):

<UserControl>
   <Canvas>
      <Grid>
         <ScrollViewer>
            <StackPanel Orientation="Horizontal">
               <StackPanel Orientation="Vertical">
                  <Canvas>
                     <Button Name="theButton" Click="theButton_Click"></Button>
                     <ComboBox Name="theCombo" SelectionChanged="theCombo_SelectionChanged"></ComboBox>
                  </Canvas>
               </StackPanel>
            </StackPanel>
         </ScrollViewer>
      </Grid>
   </Canvas>
</UserControl>

在那个 UserControl 的构造函数中:

AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(UserControl_MouseDown), true);

我需要为我自己的 UserControl 捕捉鼠标点击(我必须用鼠标在它上面绘制一个选择矩形)。因此,我使用 AddHandler(),并指示“true”,这样即使它已由我的按钮“theButton”处理,我也可以挂钩 MouseLeftButtonDownEvent(因为当单击按钮时,它会将 event Handled 属性标记为 true,如 MSDN说)

当我在我的 UserControl 中单击时,我的函数 UserControl_MouseDown 通常会被调用。但是当我单击我的按钮时,永远不会调用关联的处理程序(“theButton_Click”)。 我的 ComboBox 的 SelectionChanged 事件也是如此:它的处理程序永远不会被调用。

我使用了一个名为 Snoop 的工具来查看事件路由,这似乎很正常:我的按钮捕获了 MouseDown,然后将其 Handled 属性设置为 True。但是代码永远不会到达处理程序。

如果我为我的 UserControl 取消挂钩事件,就可以了。 我尝试为按钮使用 PreviewMouseDown。它可以运行,但我不能将它用于我的 ComboBox

您是否有任何线索可以解决该问题并让我的 UserControl 以及我的 Button 和 ComboBox 调用它们各自的处理程序?

感谢您的帮助

编辑:我的 UserControl 事件处理程序的代码

private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton == MouseButton.Left && !_isMoving)
            {
                _isLeftMouseButtonDownOnWindow = true;
                _origMouseDownPoint = e.GetPosition(this);
                this.CaptureMouse();
                e.Handled = true;
            }
        }

【问题讨论】:

  • MSDN 对此发出警告。您实际上在 UserControl 的事件处理程序中做了什么?您如何区分应该只运行按钮的 Click 事件的单击与应该开始绘制矩形的单击?
  • @HansPassant :我已使用 UserControl 的处理程序编辑了我的问题。我用布尔值(_isMoving)区分这两种情况你能给我MSDN相对于这个的链接吗?

标签: c# .net wpf events event-bubbling


【解决方案1】:

复制/粘贴我的处理程序代码后问题解决...通过删除此行:

this.CaptureMouse();

这太明显了……我的错

【讨论】:

  • 我们都有这样的时刻。希望有人过来看看发生了什么,并为自己找到解决方案。
【解决方案2】:

我不知道为什么它是被处理的,即使你为处理的事件设置了 true

但你可以在按钮之前抓住它:

 AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(UserControl_MouseDown), true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多