Ошибка мышиных событий WPF? - PullRequest
0 голосов
/ 02 ноября 2018

Я нашел обходной путь для этой ошибки. Я хочу понять , почему это происходит. Это ошибка? Есть ли лучший обходной путь? Я что-то не так делаю?

Вот самый простой код, который я мог придумать, чтобы показать проблему. Внутри 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. Появляется окно сообщения.

Теперь из объявления AnnoyingBlock в xaml удалите поле и запустите его снова. Запустите его снова, и вы увидите, что при нажатии мышью в любом месте текста Tweedle Dee появляется окно сообщения, когда вы отпускаете мышь. Удалите событие MouseDown из TextBlock в xaml и запустите его снова. Событие MouseUp на элементе управления родного брата больше не вызывается.

Почему происходит событие на элементе управления родного брата? Почему это происходит только тогда, когда у вас есть событие в элементе управления (даже если это другое событие MouseDown и MouseUp)? Почему добавление поля мешает этому случиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...