WPF MouseLeftButtonUp не стреляет
Странные события в WPF... Когда я устанавливаю событие в MouseUp, я могу запустить его, если щелкнуть правой кнопкой мыши по кнопке. Но это не сработает ни с одним щелчком мыши!
<Button MouseLeftButtonUp="btnNewConfig_MouseUp" Name="btnNewConfig">
<StackPanel Orientation="Horizontal">
<Image Source="Icons\new.ico" Height="24" Width="24" Margin="5"/>
<TextBlock VerticalAlignment="Center">New</TextBlock>
</StackPanel>
</Button>
Я знаю, что это, скорее всего, что-то простое. Спасибо за помощь!
3 ответа
Похоже, что Button-элемент поглощает это событие, так как Button.Click на самом деле является комбинацией события LeftButtonDown и события LeftButtonUp.
Но вы можете подписаться на Tunnelled событие PreviewMouseLeftButtonUp на кнопке, чтобы получить LeftButtonUp
Подписка на туннелированное событие вместо пузыря имеет некоторые довольно грязные побочные эффекты, которые я объясню позже.
Вот лучшее решение, так как оно сохраняет ваш пузырь в целости и сохранности.:)
btnNewConfig.AddHandler(MouseLeftButtonUpEvent,
new RoutedEventHandler(btnNewConfig_MouseUp),
true);
Вам нужно будет объявить обработчик событий с помощью RoutedEventArgs вместо MouseButtonEventArgs, но вы можете просто привести его обратно к MouseButtonEventArgs внутри.
void btnNewConfig_MouseUp(object sender, RoutedEventArgs e)
{
MouseButtonEventArgs args = e as MouseButtonEventArgs;
Обратите внимание на последний аргумент в AddHandler - если его значение true, ваше событие будет запущено, даже если предыдущий обработчик установил e.Handled=true;
Теперь о PreviewMouseLeftButtonUp:
Туннельные события увольняют родителей перед детьми. Пузыряние - наоборот. Если у вас задействовано много обработчиков событий, вам действительно следует придерживаться всех всплывающих окон или всех туннелей, иначе чем больше обработчиков событий вы добавите, тем более запутанным будет его получение - добавление одного нового обработчика событий может привести к повторному посещению всех остальных в приложении.
Большинство людей считают пузырьковую модель гораздо более естественной. Вот почему принятый ответ проблематичен.
Кнопка использует события MouseLeft/RightButtonUp/Down (и помечает их как "Обработанные") для своих событий Button.Click.
Как сказал Джоби, вы можете использовать событие PreviewMouseLeftButtonUp, но я хочу предложить вам создать собственный шаблон кнопки и изменить его поведение. (т.е. не помечайте MouseLeftButtonUp как Handled = true) или просто используйте что-то кроме кнопки в качестве родительского контейнера. (Зависит от того, что вам действительно нужно).