uwp: как передать событие нажатия кнопки в обработчик по умолчанию

#button #uwp #event-handling

#кнопка #uwp #обработка событий

Вопрос:

Я хотел бы обработать событие нажатия кнопки, что-то сделать, а затем разрешить выполнение обработчика по умолчанию.

Вот что у меня есть:

 <Button ... Click="OnMoreClicked" />
 

И вот мой обработчик

 void onMoreClicked (object sender, RoutedEventArgs e)
{
  ... do something ...
  ... continue with default button handler ...
}
 

Редактировать:

Кнопка активирует всплывающее окно, поэтому у нее уже есть обработчик для этого, и я хочу убедиться, что обработчик будет выполнен.

РЕДАКТИРОВАТЬ 2: мой пример кода был слишком минимальным. Вместо этого посмотрите на это:

 <Button ... Click="onMoreClicked">
  <Button.Flyout > 
   ...
  </Button.Flyout>
</Button>
 

И

 public void onMoreClicked (object sender, RoutedEventArgs e)
{
  ... do something ...
  ... call default handler to show flyout ...
}
 

Комментарии:

1. Почему бы не сделать это в обработчике нажатия кнопки по умолчанию, затем вызвать другую функцию и передать отправителю и аргументам этой функции? И еще один вопрос: почему вам нужно выполнять свой логический процесс двумя способами?

2. Простите меня, поскольку я новичок в C # и UWP. Я не понимаю вашего комментария. Во-первых, о каких «двух методах» вы говорите? Во-вторых, как мне это сделать в обработчике нажатия кнопки по умолчанию — вы предлагаете мне подкласс этого обработчика? Если да, то как. Если у вас есть полный ответ, пожалуйста, напишите, и я отдам вам должное 🙂

3. @PeriHartman: не существует такого понятия, как «обработчик по умолчанию». Делайте все, что хотите, внутри своего OnMoreClicked обработчика событий и не беспокойтесь о части «продолжить с обработчиком кнопок по умолчанию». Или что именно вы пытаетесь продолжить?

4. @mm8: я не знаю правильной терминологии, очевидно (пожалуйста, посоветуйте). Я имею в виду обработчик, который будет выполняться, если я его не объявлю. И, да, я хочу, чтобы обработчик «по умолчанию» выполнялся после завершения моего обработчика.

5. Обработчик по умолчанию не выполняется, если вы не подписаны на событие. Чего вы ожидаете?

Ответ №1:

Обработчик Click события вызывается перед Flyout отображением.

Итак, вы, например, меняете Background значение Button в обработчике событий:

 private void onMoreClicked(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = new SolidColorBrush(Colors.AliceBlue);
}
 

… и все еще видите Flyout :

введите описание изображения здесь

Вы также можете обрабатывать Opened события , Opening , Closed или Closing MenuFlyout .

Или используйте an AttachedFlyout и покажите его программно, используя ShowAttachedFlyout метод:

 private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    //...
    Flyout.ShowAttachedFlyout(button);
}
 

XAML:

 <Button Content="Button With Flyout" Click="Button_Click">
    <FlyoutBase.AttachedFlyout>
        <MenuFlyout>
            <MenuFlyoutItem Text="Edit" />
        </MenuFlyout>
    </FlyoutBase.AttachedFlyout>
</Button>
 

Комментарии:

1. @PeriHartman: Это отвечает на ваш вопрос?

2. Да, но почему это не работает, когда я использую Button. Всплывающее окно? Странно, что UWP напрямую не поддерживает такое поведение.

3. Что не работает? Вы не можете вызвать ShowAttachedFlyout a Flyout , который не задан в качестве значения FlyoutBase.AttachedFlyout свойства.

4. Видимо, моя интуиция неверна, но я бы предположил, что кнопка. Всплывающий список реализован как FlyoutBase. AttachedFlyout. Я не вижу причин, по которым этого не должно быть. Но, видимо, это что-то совершенно другое.

5. FlyoutBase.AttachedFlyout является присоединенным свойством , которое может быть установлено для любого элемента независимо от того, имеет ли класс Flyout свойство.