public partial class MainWindow : Window

{

  string _mouseActivity = string.Empty;

  public MainWindow

  {

    InitializeComponent;

  }

  public void btnClickMe_Clicked(object sender, RoutedEventArgs e)

  {

    AddEventInfo(sender, e);

    MessageBox.Show(_mouseActivity, "Your Event Info");

    // Очистить строку для следующего цикла.

    _mouseActivity = "";

  }

  private void AddEventInfo(object sender, RoutedEventArgs e)

  {

    _mouseActivity += string.Format(

      "{0} sent a {1} event named {2}.\n", sender,

      e.RoutedEvent.RoutingStrategy,

      e.RoutedEvent.Name);

  }

  private void outerEllipse_MouseDown(object sender, MouseButtonEventArgs e)

  {

    AddEventInfo(sender, e);

  }

  private void outerEllipse_PreviewMouseDown(object sender,

                                             MouseButtonEventArgs e)

  {

    AddEventInfo(sender, e);

  }

}

Обратите внимание, что ни в одном обработчике событий пузырьковое распространение не останавливается. После запуска приложения отобразится окно с уникальным сообщением, которое зависит от места на кнопке, где был произведен щелчок. На рис. 25.15 показан результат щелчка на внешнем объекте Ellipse.

Итак, почему события WPF обычно встречаются парами (одно туннельное и одно пузырьковое)? Ответ можно сформулировать так: благодаря предварительному просмотру событий появляется возможность выполнения любой специальной логики (проверки достоверности данных, отключения пузырькового распространения и т.п.) перед запуском пузырькового аналога событий. В качестве примера предположим, что создается элемент TextBox, который должен содержать только числовые данные. В нем можно было бы обработать событие PreviewKeyDown; если выясняется, что пользователь ввел нечисловые данные, то пузырьковое событие легко отменить, установив свойство Handled в true.

Как несложно было предположить, при построении специального элемента управления, который поддерживает специальные события, событие допускается реализовать так, чтобы оно могло распространяться пузырьковым (или туннельным) образом по дереву разметки XAML. В настоящей главе мы не рассматриваем процесс создания специальных маршрутизируемых событий (хотя он не особо отличается от построения специального свойства зависимости). Если интересно, загляните в раздел "Routed Events Overview" ("Обзор маршрутизируемых событий") документации по .NET Core, где предлагается несколько обучающих руководств, которые помогут в освоении этой темы.

<p id="AutBody_Root1144"><strong>Более глубокое исследование API-интерфейсов и элементов управления WPF</strong></p>

В оставшемся материале главы будет построено новое приложение WPF с применением Visual Studio. Целью является создание пользовательского интерфейса, который состоит из виджета TabControl, содержащего набор вкладок. Каждая вкладка будет иллюстрировать несколько новых элементов управления WPF и интересные API-интерфейсы, которые могут быть задействованы в разрабатываемых проектах. Попутно вы также узнаете о дополнительных возможностях визуальных конструкторов WPF из Visual Studio.

<p id="AutBody_Root1145"><strong>Работа с элементом управления TabControl</strong></p>

Первым делом создайте новый проект приложения WPF по имени WpfControlsAndAPIs. Как упоминалось ранее, начальное окно будет содержать элемент управления TabControl с четырьмя вкладками, каждая из которых отображает набор связанных элементов управления и/или API-интерфейсов WPF. Установите свойство Width окна в 800, а свойство Height окна в 350.

Перетащите элемент управления TabControl из панели инструментов Visual Studio на поверхность визуального конструктора и модифицируйте его разметку следующим образом:

     VerticalAlignment="Stretch">

 

   

  

   

     

  

Вы заметите, что два элемента типа вкладок  предоставляются автоматически. Чтобы добавить дополнительные вкладки, нужно щелкнуть правой кнопкой мыши на узле TabControl в окне Document Outline и выбрать в контекстном меню пункт Add TabItem (Добавить TabItem). Можно также щелкнуть правой кнопкой мыши на элементе TabControl в визуальном конструкторе и выбрать тот же самый пункт меню или просто ввести разметку в редакторе XAML. Добавьте одну дополнительную вкладку, используя любой из подходов.

Перейти на страницу:

Похожие книги