我正在努力解决一个让我发疯的问题。
这是我的 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;
}
}