Пошаговое руководство. Размещение составного элемента управления WPF в форме Windows Forms

Windows Presentation Foundation (WPF) предоставляет широкие возможности для создания приложений. Однако если у вас есть существенные инвестиции в код Windows Forms, это может быть более эффективным для расширения существующего приложения Windows Forms с помощью WPF, а не для перезаписи его с нуля. Один из распространенных сценариев состоит в необходимости внедрения одного или нескольких элементов управления, реализованных с помощью WPF, в приложение Windows Forms. Дополнительные сведения о настройке элементов управления WPF см. в разделе Настройка элементов управления.

В этом пошаговом руководстве создается приложение, в котором содержится составной элемент управления WPF для поддержки ввода данных в Windows Forms. Составной элемент управления упакован в библиотеку DLL. Эта общая процедура может быть расширена для более сложных приложений и элементов управления. Это пошаговое руководство почти идентично повторяет свойства и функциональные возможности, описанные в разделе Пошаговое руководство. Размещение составного элемента управления Windows Forms в приложении WPF. Основным отличием является то, что сценарий размещения выполняется в обратном порядке.

Пошаговое руководство состоит из двух разделов. В первом разделе кратко описывается реализация составного элемента управления WPF. Во втором разделе подробно рассматриваются размещение составного элемента управления в приложении Windows Forms, получение событий от него и доступ к некоторым свойствам элемента управления.

В данном пошаговом руководстве представлены следующие задачи.

  • Реализация составного элемента управления WPF

  • Реализация ведущего приложения Windows Forms

Полный пример кода для задач, демонстрируемых в этом руководстве, см. в разделе Пример размещения составного элемента управления WPF в приложении Windows Forms.

Необходимые компоненты

Для выполнения шагов, описанных в этом руководстве, вам понадобится Visual Studio.

Реализация составного элемента управления WPF

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

На следующем рисунке показан составной элемент управления WPF.

Screenshot that shows a simple WPF control.

Создание проекта

Для запуска проекта выполните указанные ниже действия.

  1. Запустите Visual Studio и откройте диалоговое окно Новый проект.

  2. В Visual C# и категории Windows выберите шаблон Библиотека пользовательских элементов управления WPF.

  3. Присвойте проекту имя MyControls.

  4. В качестве расположения задайте папку верхнего уровня с понятным именем, например WindowsFormsHostingWpfControl. Позже ведущее приложение будет помещено в эту папку.

  5. Нажмите кнопку ОК, чтобы создать проект. По умолчанию проект содержит один элемент управления с именем UserControl1.

  6. В обозревателе решений переименуйте элемент управления UserControl1 в MyControl1.

Проект должен иметь ссылки на перечисленные ниже системные библиотеки DLL. Если какие-либо из этих библиотек DLL не включены по умолчанию, добавьте их в проект.

  • PresentationCore

  • PresentationFramework

  • Система

  • WindowsBase

Создание пользовательского интерфейса

Пользовательский интерфейс для составного элемента управления реализуется с помощью языка разметки расширяемых приложений (XAML). Составной пользовательский интерфейс элемента управления состоит из пяти TextBox элементов. Каждый из элементов TextBox имеет связанный с ним элемент TextBlock, который служит в качестве метки. Существует два элемента Button в нижней части окна: кнопки OK и Отмена. При нажатии любой кнопки элемент управления создает пользовательское событие для возвращения сведений в ведущее приложение.

Базовый макет

Различные элементы пользовательского интерфейса содержатся внутри элемента Grid. Объект Grid можно использовать для размещения содержимого составного элемента управления практически так же, как элемент Table в HTML. WPF также располагает элементом Table, однако Grid менее ресурсоемок и лучше подходит для простых задач макетирования.

В приведенном ниже коде XAML показан базовый макет. Этот код XAML определяет общую структуру элемента управления, задавая число столбцов и строк в элементе Grid.

В файле MyControl1.xaml замените имеющийся код XAML приведенным ниже кодом.

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="MyControls.MyControl1"
      Background="#DCDCDC"
      Width="375"
      Height="250"
      Name="rootElement"
      Loaded="Init">

  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="Auto"/>
  </Grid.ColumnDefinitions>

  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
</Grid>

Добавление в сетку элементов TextBlock и TextBox

Элемент пользовательского интерфейса размещается в сетке путем задания атрибутов RowProperty и ColumnProperty для элементов в соответствующее значение номере столбца и строки. Следует помнить, что нумерация строк и столбцов ведется от нуля. Задав атрибут ColumnSpanProperty, можно создать элемент, который растягивается на несколько столбцов или строк. Для получения дополнительных сведений об элементах Grid, см. статью Создание элемента сетки.

В следующем фрагменте XAML демонстрируются элементы TextBox и TextBlock составного элемента управления с атрибутами RowProperty и ColumnProperty. Они задаются, чтобы корректно разместить элементы в сетке.

В файле MyControl1.xaml, добавьте следующий код XAML внутри элемента Grid.

  <TextBlock Grid.Column="0"
        Grid.Row="0" 
        Grid.ColumnSpan="4"
        Margin="10,5,10,0"
        HorizontalAlignment="Center"
        Style="{StaticResource titleText}">Simple WPF Control</TextBlock>

  <TextBlock Grid.Column="0"
        Grid.Row="1"
        Style="{StaticResource inlineText}"
        Name="nameLabel">Name</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="1"
        Grid.ColumnSpan="3"
        Name="txtName"/>

  <TextBlock Grid.Column="0"
        Grid.Row="2"
        Style="{StaticResource inlineText}"
        Name="addressLabel">Street Address</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="2"
        Grid.ColumnSpan="3"
        Name="txtAddress"/>

  <TextBlock Grid.Column="0"
        Grid.Row="3"
        Style="{StaticResource inlineText}"
        Name="cityLabel">City</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="3"
        Width="100"
        Name="txtCity"/>

  <TextBlock Grid.Column="2"
        Grid.Row="3"
        Style="{StaticResource inlineText}"
        Name="stateLabel">State</TextBlock>
  <TextBox Grid.Column="3"
        Grid.Row="3"
        Width="50"
        Name="txtState"/>

  <TextBlock Grid.Column="0"
        Grid.Row="4"
        Style="{StaticResource inlineText}"
        Name="zipLabel">Zip</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="4"
        Width="100"
        Name="txtZip"/>

Создание стилей элементов пользовательского интерфейса

Многие элементы в форме для ввода данных имеют одинаковый внешний вид. Это означает, что они имеют одинаковые значения нескольких свойств. Вместо того чтобы задавать атрибуты отдельно для каждого элемента, в предыдущем коде XAML используются элементы Style с целью определения стандартных значений свойств для классов элементов. Такой подход упрощает элемент управления и позволяет изменять внешний вид нескольких элементов посредством одного атрибута стиля.

Элементы Style содержатся в свойстве Resources элемента Grid так, чтобы их могли использовать любые элементы в элементе управления. Если стиль именован, он применяется к элементу посредством добавления набора элементов Style к стилю с заданным именем. Неименованные стили становятся стилями по умолчанию для элемента. Дополнительные сведения о стилях WPF см. в статье Стили и шаблоны в WPF.

В приведенном ниже коде XAML показаны элементы Style для составного элемента управления. Чтобы увидеть, как стили применяются к элементам, см. предыдущий код XAML. Например, у последнего элемента TextBlock стиль inlineText, а у последнего элемента TextBox — стиль по умолчанию.

В файле MyControl1.xaml добавьте приведенный ниже код XAML сразу после начального элемента Grid.

<Grid.Resources>
  <Style x:Key="inlineText" TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="FontWeight" Value="Normal"/>
    <Setter Property="FontSize" Value="12"/>
  </Style>
  <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
    <Setter Property="DockPanel.Dock" Value="Top"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
  <Style TargetType="{x:Type Button}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="Width" Value="60"/>
  </Style>
  <Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
</Grid.Resources>

Добавление кнопок OK и "Отмена"

Завершающими элементами составного элемента управления являются элементы ButtonOK и Отмена, которые занимают первые два столбца последней строки элемента Grid. Эти элементы используют общий обработчик событий ButtonClicked и стиль по умолчанию Button, определенный в предыдущем коде XAML.

В файле MyControl1.xaml добавьте приведенный ниже код XAML после последнего элемента TextBox. Часть XAML составного элемента управления завершена.

<Button Grid.Row="5"
        Grid.Column="0"
        Name="btnOK"
        Click="ButtonClicked">OK</Button>
<Button Grid.Row="5"
        Grid.Column="1"
        Name="btnCancel"
        Click="ButtonClicked">Cancel</Button>

Реализация файла кода программной части

Файл кода программной части MyControl1.xaml.cs реализует три важные задачи:

  1. обрабатывает событие, когда пользователь нажимает одну из кнопок;

  2. извлекает данные из элементов TextBox и упаковывает их в объект аргумента пользовательского события;

  3. вызывает пользовательское событие OnButtonClick, которое уведомляет ведущее приложение о том, что пользователь завершил работу, и возвращает данные в ведущее приложение.

Элемент управления также предоставляет ряд свойств цвета и шрифтов, которые позволяют изменять внешний вид. В отличие от класса WindowsFormsHost, который используется для размещения элемента управления Windows Forms, класс ElementHost предоставляет только свойство Background элемента управления. Чтобы обеспечить сходство между этим примером кода и примером, который обсуждается в разделе Пошаговое руководство. Размещение составного элемента управления Windows Forms в приложении WPF, элемент управления непосредственно предоставляет остальные свойства.

Базовая структура файла кода программной части

Файл кода программной части содержит одно пространство имен MyControls, которое состоит из двух классов: MyControl1 и MyControlEventArgs.

namespace MyControls  
{  
  public partial class MyControl1 : Grid  
  {  
    //...  
  }  
  public class MyControlEventArgs : EventArgs  
  {  
    //...  
  }  
}  

Первый класс, MyControl1, — это разделяемый класс, содержащий код, который реализует функциональные возможности пользовательского интерфейса, определенного в файле MyControl1.xaml. При синтаксическом анализе файла MyControl1.xaml код XAML преобразуется в тот же разделяемый класс и два разделяемых класса объединяются для формирования скомпилированного элемента управления. По этой причине имя класса в файле кода программной части должно совпадать с именем класса, назначенным в файле MyControl1.xaml, и наследоваться от корневого элемента управления. Второй класс, MyControlEventArgs, является классом аргументов события, который используется для возвращения данных в ведущее приложение.

Откройте файл MyControl1.xaml.cs. Измените существующее объявление класса, чтобы он имел указанное ниже имя и наследовался от элемента Grid.

public partial class MyControl1 : Grid

Инициализация элемента управления

Приведенный ниже код реализует несколько основных задач:

  • объявляет частное событие OnButtonClick и его связанный делегат MyControlEventHandler;

  • создает несколько частных глобальных переменных, хранящих данные пользователя. Эти данные предоставляются через соответствующие свойства;

  • Реализует обработчик Initдля события элемента управления Loaded. Этот обработчик инициализирует глобальные переменные путем присвоения им значений, определенных в файле MyControl1.xaml. Для этого используется свойство Name, назначенное обычному элементу TextBlock —nameLabel, для доступа к настройкам свойств элемента.

Удалите существующий конструктор и добавьте приведенный ниже код в класс MyControl1.

public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
private FontWeight _fontWeight;
private double _fontSize;
private FontFamily _fontFamily;
private FontStyle _fontStyle;
private SolidColorBrush _foreground;
private SolidColorBrush _background;

private void Init(object sender, EventArgs e)
{
    //They all have the same style, so use nameLabel to set initial values.
    _fontWeight = nameLabel.FontWeight;
    _fontSize = nameLabel.FontSize;
    _fontFamily = nameLabel.FontFamily;
    _fontStyle = nameLabel.FontStyle;
    _foreground = (SolidColorBrush)nameLabel.Foreground;
    _background = (SolidColorBrush)rootElement.Background;
}

Обработка событий нажатия кнопки

Пользователь указывает, что задача ввода данных завершена, нажимая кнопку OK или Отмена. Обе кнопки используют один и тот же обработчик события Click: ButtonClicked. Обе кнопки имеют имя btnOK или btnCancel, которое позволяет обработчику определить, какая кнопка была нажата, путем проверки значения аргумента sender. Обработчик выполняет следующие действия:

  • создает объект MyControlEventArgs, содержащий данные из двух операндов TextBox;

  • если пользователь нажимает кнопку Отмена, для свойства IsOK объекта MyControlEventArgs задает значение false;

  • вызывает событие OnButtonClick, чтобы указать ведущему приложению, что пользователь завершил работу, и передает обратно собранные данные.

Добавьте приведенный ниже код в класс MyControl1 после метода Init.

private void ButtonClicked(object sender, RoutedEventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                        txtName.Text,
                                                        txtAddress.Text,
                                                        txtCity.Text,
                                                        txtState.Text,
                                                        txtZip.Text);
    if (sender == btnCancel)
    {
        retvals.IsOK = false;
    }
    if (OnButtonClick != null)
        OnButtonClick(this, retvals);
}

Создание свойств

Оставшаяся часть класса просто предоставляет свойства, которые соответствуют описанным выше глобальным переменным. При изменении свойства метод доступа set изменяет внешний вид элемента управления путем изменения соответствующих свойств элемента и обновления базовых глобальных переменных.

Добавьте приведенный ниже код к классу MyControl1.

public FontWeight MyControl_FontWeight
{
    get { return _fontWeight; }
    set
    {
        _fontWeight = value;
        nameLabel.FontWeight = value;
        addressLabel.FontWeight = value;
        cityLabel.FontWeight = value;
        stateLabel.FontWeight = value;
        zipLabel.FontWeight = value;
    }
}
public double MyControl_FontSize
{
    get { return _fontSize; }
    set
    {
        _fontSize = value;
        nameLabel.FontSize = value;
        addressLabel.FontSize = value;
        cityLabel.FontSize = value;
        stateLabel.FontSize = value;
        zipLabel.FontSize = value;
    }
}
public FontStyle MyControl_FontStyle
{
    get { return _fontStyle; }
    set
    {
        _fontStyle = value;
        nameLabel.FontStyle = value;
        addressLabel.FontStyle = value;
        cityLabel.FontStyle = value;
        stateLabel.FontStyle = value;
        zipLabel.FontStyle = value;
    }
}
public FontFamily MyControl_FontFamily
{
    get { return _fontFamily; }
    set
    {
        _fontFamily = value;
        nameLabel.FontFamily = value;
        addressLabel.FontFamily = value;
        cityLabel.FontFamily = value;
        stateLabel.FontFamily = value;
        zipLabel.FontFamily = value;
    }
}

public SolidColorBrush MyControl_Background
{
    get { return _background; }
    set
    {
        _background = value;
        rootElement.Background = value;
    }
}
public SolidColorBrush MyControl_Foreground
{
    get { return _foreground; }
    set
    {
        _foreground = value;
        nameLabel.Foreground = value;
        addressLabel.Foreground = value;
        cityLabel.Foreground = value;
        stateLabel.Foreground = value;
        zipLabel.Foreground = value;
    }
}

Отправка данных обратно в ведущее приложение

Последним компонентом в файле является класс MyControlEventArgs, который используется для отправки собранных данных обратно в ведущее приложение.

Добавьте приведенный ниже код к пространству имен MyControls. Реализация является простой и далее не рассматривается.

public class MyControlEventArgs : EventArgs
{
    private string _Name;
    private string _StreetAddress;
    private string _City;
    private string _State;
    private string _Zip;
    private bool _IsOK;

    public MyControlEventArgs(bool result,
                              string name,
                              string address,
                              string city,
                              string state,
                              string zip)
    {
        _IsOK = result;
        _Name = name;
        _StreetAddress = address;
        _City = city;
        _State = state;
        _Zip = zip;
    }

    public string MyName
    {
        get { return _Name; }
        set { _Name = value; }
    }
    public string MyStreetAddress
    {
        get { return _StreetAddress; }
        set { _StreetAddress = value; }
    }
    public string MyCity
    {
        get { return _City; }
        set { _City = value; }
    }
    public string MyState
    {
        get { return _State; }
        set { _State = value; }
    }
    public string MyZip
    {
        get { return _Zip; }
        set { _Zip = value; }
    }
    public bool IsOK
    {
        get { return _IsOK; }
        set { _IsOK = value; }
    }
}

Постройте решение. Сборка создаст библиотеку DLL с именем MyControls.dll.

Реализация ведущего приложения Windows Forms

Ведущее приложение Windows Forms использует объект ElementHost для размещения составного элемента управления WPF. Приложение обрабатывает событие OnButtonClick для получения данных из составного элемента управления. Приложение также содержит набор переключателей, которые можно использовать для изменения внешнего вида элемента управления. На рисунке ниже показано приложение.

На следующем рисунке показан составной элемент управления WPF, размещенный в приложении Windows Forms

Screenshot that shows a Windows Form Hosting Avalon control.

Создание проекта

Для запуска проекта выполните указанные ниже действия.

  1. Запустите Visual Studio и откройте диалоговое окно Новый проект.

  2. В Visual C# и категории Windows выберите шаблон Приложение Windows Forms.

  3. Присвойте проекту имя WFHost.

  4. В качестве расположения укажите ту же папку верхнего уровня, в которой содержится проект MyControls.

  5. Нажмите кнопку ОК, чтобы создать проект.

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

  1. Щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите команду Добавить ссылку.

  2. Перейдите на вкладку Обзор и выберите папку, которая содержит файл MyControls.dll. В данном пошаговом руководстве это папка MyControls\bin\Debug.

  3. Выберите файл MyControls.dll и нажмите кнопку ОК.

  4. Добавьте ссылки на следующие сборки.

    • PresentationCore

    • PresentationFramework

    • System.Xaml

    • WindowsBase

    • WindowsFormsIntegration

Реализация пользовательского интерфейса для приложения

Пользовательский интерфейс приложения Windows Forms содержит несколько элементов управления для взаимодействия с составным элементом управления WPF.

  1. Откройте приложение Form1 в конструкторе Windows Forms.

  2. Увеличьте форму, чтобы разместить элементы управления.

  3. В правом верхнем углу формы добавьте элемент управления System.Windows.Forms.Panel, который будет размещать составной элемент управления WPF.

  4. Добавьте в форму следующие элементы управления System.Windows.Forms.GroupBox.

    Имя Текст
    groupBox1 Цвет фона
    groupBox2 Цвет переднего плана
    groupBox3 Размер шрифта
    groupBox4 Семейство шрифтов
    groupBox5 Начертание
    groupBox6 Насыщенность шрифта
    groupBox7 Данные из элемента управления
  5. Добавьте следующие элементы управления System.Windows.Forms.RadioButton в элементы управления System.Windows.Forms.GroupBox.

    GroupBox Имя Текст
    groupBox1 radioBackgroundOriginal Исходная
    groupBox1 radioBackgroundLightGreen LightGreen
    groupBox1 radioBackgroundLightSalmon LightSalmon
    groupBox2 radioForegroundOriginal Исходная
    groupBox2 radioForegroundRed Красный
    groupBox2 radioForegroundYellow Желтый
    groupBox3 radioSizeOriginal Исходная
    groupBox3 radioSizeTen 10
    groupBox3 radioSizeTwelve 12
    groupBox4 radioFamilyOriginal Исходная
    groupBox4 radioFamilyTimes Times New Roman Cyr
    groupBox4 radioFamilyWingDings WingDings
    groupBox5 radioStyleOriginal Обычная
    groupBox5 radioStyleItalic Italic
    groupBox6 radioWeightOriginal Исходная
    groupBox6 radioWeightBold Жирный
  6. Добавьте следующие элементы управления System.Windows.Forms.Label в последний элемент System.Windows.Forms.GroupBox. Эти элементы управления отображают данные, возвращенные составным элементом управления WPF.

    GroupBox Имя Текст
    groupBox7 lblName Имя:
    groupBox7 lblAddress Почтовый адрес:
    groupBox7 lblCity Город:
    groupBox7 lblState Штат:
    groupBox7 lblZip Почтовый индекс:

Инициализация формы

Код размещения обычно реализуется в обработчике событий Load формы. В приведенном ниже коде показаны обработчик событий Load, обработчик событий Loaded составного элемента управления WPF и объявления нескольких глобальных переменных, которые будут использованы позже.

В конструкторе Windows Forms дважды щелкните форму, чтобы открыть обработчик события Load. В начале файла Form1.cs добавьте указанные ниже операторы using.

using System.Windows;
using System.Windows.Forms.Integration;
using System.Windows.Media;

Замените содержимое существующего класса Form1 приведенным ниже кодом.

private ElementHost ctrlHost;
private MyControls.MyControl1 wpfAddressCtrl;
System.Windows.FontWeight initFontWeight;
double initFontSize;
System.Windows.FontStyle initFontStyle;
System.Windows.Media.SolidColorBrush initBackBrush;
System.Windows.Media.SolidColorBrush initForeBrush;
System.Windows.Media.FontFamily initFontFamily;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    ctrlHost = new ElementHost();
    ctrlHost.Dock = DockStyle.Fill;
    panel1.Controls.Add(ctrlHost);
    wpfAddressCtrl = new MyControls.MyControl1();
    wpfAddressCtrl.InitializeComponent();
    ctrlHost.Child = wpfAddressCtrl;

    wpfAddressCtrl.OnButtonClick +=
        new MyControls.MyControl1.MyControlEventHandler(
        avAddressCtrl_OnButtonClick);
    wpfAddressCtrl.Loaded += new RoutedEventHandler(
        avAddressCtrl_Loaded);
}

void avAddressCtrl_Loaded(object sender, EventArgs e)
{
    initBackBrush = (SolidColorBrush)wpfAddressCtrl.MyControl_Background;
    initForeBrush = wpfAddressCtrl.MyControl_Foreground;
    initFontFamily = wpfAddressCtrl.MyControl_FontFamily;
    initFontSize = wpfAddressCtrl.MyControl_FontSize;
    initFontWeight = wpfAddressCtrl.MyControl_FontWeight;
    initFontStyle = wpfAddressCtrl.MyControl_FontStyle;
}

Метод Form1_Load в предыдущем коде показывает общую процедуру размещения элемента управления WPF.

  1. Создайте новый объект ElementHost.

  2. Задайте для свойства Dock элемента управления значение DockStyle.Fill.

  3. Добавьте элемент управления ElementHost в коллекцию Controls элемента управления Panel.

  4. Создайте экземпляр элемента управления WPF.

  5. Разместите составной элемент управления на форме, назначив элемент управления свойству Child элемента управления ElementHost.

Остальные две строки в методе Form1_Load присоединяют обработчики к двум событиям элемента управления.

  • OnButtonClick — пользовательское событие, создаваемое составным элементом управления при нажатии кнопки OK или Отмена. Обработайте событие для получения ответа пользователя и сбора всех введенных им данных.

  • Loaded — это стандартное событие, которое вызывается элементом управления WPF при завершении загрузки. Это событие используется здесь потому, что для примера необходима инициализация нескольких глобальных переменных свойствами элемента управления. Во время события Load формы элемент управления не полностью загружен и для этих переменных по-прежнему задано значение null. Прежде чем получить доступ к этим свойствам, необходимо дождаться события Loaded элемента управления.

Обработчик события Loaded показан в коде ранее. Обработчик OnButtonClick рассматривается в следующем разделе.

Обработка события OnButtonClick

Событие OnButtonClick происходит, когда пользователь нажимает кнопку ОК или Отмена.

Обработчик событий проверяет поле IsOK аргумента события, чтобы определить, какая кнопка была нажата. Переменные lbldata соответствуют элементам управления Label, которые были описаны выше. Если пользователь нажимает кнопку OK, данные элементов управления, размещенных на TextBox, назначаются соответствующему элементу управления Label. Если же пользователь нажимает Отмена, в значения Text передаются строки по умолчанию.

Добавьте приведенный ниже код обработчика событий нажатия кнопки в класс Form1.

void avAddressCtrl_OnButtonClick(
    object sender,
    MyControls.MyControl1.MyControlEventArgs args)
{
    if (args.IsOK)
    {
        lblAddress.Text = "Street Address: " + args.MyStreetAddress;
        lblCity.Text = "City: " + args.MyCity;
        lblName.Text = "Name: " + args.MyName;
        lblState.Text = "State: " + args.MyState;
        lblZip.Text = "Zip: " + args.MyZip;
    }
    else
    {
        lblAddress.Text = "Street Address: ";
        lblCity.Text = "City: ";
        lblName.Text = "Name: ";
        lblState.Text = "State: ";
        lblZip.Text = "Zip: ";
    }
}

Выполните сборку приложения и запустите его. Добавьте произвольный текст в составной элемент управления WPF и нажмите кнопку OK. Этот текст появится в метках. На данном этапе код для обработки переключателей еще не добавлен.

Изменение внешнего вида элемента управления

Элементы управления RadioButton формы позволяют пользователю изменять цвет шрифта и фона составного элемента управления WPF, а также ряд свойств шрифта. Цвет фона предоставляется объектом ElementHost. Остальные свойства предоставляются как настраиваемые свойства элемента управления.

Дважды щелкните каждый элемент управления RadioButton в форме, чтобы создать обработчики событий CheckedChanged. Замените обработчики событий CheckedChanged следующим кодом.

private void radioBackgroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = initBackBrush;
}

private void radioBackgroundLightGreen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightGreen);
}

private void radioBackgroundLightSalmon_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightSalmon);
}

private void radioForegroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = initForeBrush;
}

private void radioForegroundRed_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Red);
}

private void radioForegroundYellow_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Yellow);
}

private void radioFamilyOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = initFontFamily;
}

private void radioFamilyTimes_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new System.Windows.Media.FontFamily("Times New Roman");
}

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new System.Windows.Media.FontFamily("WingDings");
}

private void radioSizeOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = initFontSize;
}

private void radioSizeTen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 10;
}

private void radioSizeTwelve_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 12;
}

private void radioStyleOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = initFontStyle;
}

private void radioStyleItalic_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = System.Windows.FontStyles.Italic;
}

private void radioWeightOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = initFontWeight;
}

private void radioWeightBold_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = FontWeights.Bold;
}

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

См. также