Я нашел обходной путь для этой ошибки. Я хочу понять , почему это происходит. Это ошибка? Есть ли лучший обходной путь? Я что-то не так делаю?
Вот самый простой код, который я мог придумать, чтобы показать проблему. Внутри 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)? Почему добавление поля мешает этому случиться?