WPF鼠标事件错误?

时间:2018-11-02 12:01:56

标签: c# wpf

我找到了一个解决此错误的方法,我想了解为什么。是虫子吗?有更好的解决方法吗?我在做错什么吗?

这是我可以用来说明问题的最简单的代码。在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中的T​​extBlock中删除MouseDown事件,然后再次运行它。兄弟控件上的MouseUp事件不再被触发。

为什么同级控件上的事件被触发?为什么仅当控件上有一个事件时才发生这种情况(即使它是MouseDown与MouseUp的不同事件)?为什么增加边距阻止了这种情况的发生?

0 个答案:

没有答案