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) или просто используйте что-то кроме кнопки в качестве родительского контейнера. (Зависит от того, что вам действительно нужно).

Другие вопросы по тегам