WPF MouseLeftButtonUp не стреляет - PullRequest
11 голосов
/ 25 ноября 2008

Странные события в 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 ]

25 голосов
/ 25 ноября 2008

Похоже, что кнопочный элемент управления поглощает это событие, поскольку Button.Click фактически является комбинацией события LeftButtonDown и события LeftButtonUp.

Но вы можете подписаться на туннельное событие PreviewMouseLeftButtonUp на кнопке, чтобы получить LeftButtonUp

2 голосов
/ 04 августа 2011

Кнопка использует события MouseLeft / RightButtonUp / Down (и помечает их как «Обработанные») для своих событий Button.Click.

Как сказал Джоби, вы можете использовать событие PreviewMouseLeftButtonUp, но я хочу предложить вам создать собственный шаблон кнопки и изменить его поведение. (т.е. не помечайте MouseLeftButtonUp как Handled = true) или просто используйте что-то еще, кроме кнопки, в качестве родительского контейнера. (Зависит от того, что вам действительно нужно).

1 голос
/ 10 мая 2018

Подписка на туннельное событие вместо пузыря имеет некоторые довольно грязные побочные эффекты, которые я объясню позже.

Вот лучшее решение, так как оно сохраняет ваш пузырь в целости и сохранности. :)

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

...