我找到了一个解决此错误的方法,我想了解为什么。是虫子吗?有更好的解决方法吗?我在做错什么吗?
这是我可以用来说明问题的最简单的代码。在MainWindow.xaml内部:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<local:AnnoyingBlock Margin="5"/>
<TextBlock Text="Tweedle Dee" MouseDown="MoveWindow"/>
</StackPanel>
</Grid>
在MainWindow.xaml.cs内部
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void MoveWindow(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left) Dispatcher.Invoke(DragMove);
e.Handled = true;
}
}
class AnnoyingBlock : TextBlock
{
public AnnoyingBlock()
{
MouseLeftButtonUp += OnMouseUp;
Text = "Tweedle Dumb";
}
private void OnMouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Boom");
}
}
运行该代码,然后单击/拖动文本Tweedle Dee。它可以按预期工作,并且用鼠标移动了窗口。单击文本Tweedle Dumb。出现消息框。
现在,从xaml中的AnnoyingBlock声明中,删除边距并再次运行它。再次运行它,您应该看到在松开鼠标时单击Tweedle Dee文本中的任何位置都会弹出消息框。从xaml中的TextBlock中删除MouseDown事件,然后再次运行它。兄弟控件上的MouseUp事件不再被触发。
为什么同级控件上的事件被触发?为什么仅当控件上有一个事件时才发生这种情况(即使它是MouseDown与MouseUp的不同事件)?为什么增加边距阻止了这种情况的发生?