从未调用过MouseLeftButtonDown处理程序

时间:2013-11-12 15:28:39

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

我正在努力解决让我疯狂的问题。

这是我的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”,这样我就可以挂钩MouseLeftButtonDownEvent,即使它已被我的Button“theButton”处理(因为当单击一个按钮时,它将事件Handled属性标记为真如MSDN说)

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

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

如果我为UserControl取消了该事件,那就没关系。 我尝试使用PreviewMouseDown作为Button。它运行,但我不能将它用于我的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;
            }
        }

2 个答案:

答案 0 :(得分:1)

复制/粘贴我的处理程序代码后问题解决了...删除这一行:

this.CaptureMouse();

那是如此明显......我的不好

答案 1 :(得分:0)

我不知道为什么它被处理,即使你为处理事件设置为真

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

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