Поделиться через


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

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

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

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

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

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

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

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

Предварительные требования

Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.

  • Visual Studio 2010.

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

Составной элемент управления Windows Forms, используемый этом примере, является простой формой ввода данных. Эта форма принимает имя и адрес пользователя и затем использует пользовательское событие для возвращения сведений узлу. На следующем рисунке показан отображаемый элемент управления.

Составной элемент управления Windows Forms

Простой элемент управления Windows Forms

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

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

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

  2. В категории Windows выберите шаблон Библиотека элементов управления Windows Forms.

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

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

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

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

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

  • Система

  • System.Data

  • System.Drawing

  • System.Windows.Forms

  • System.Xml

Добавление элементов управления в форму

Для добавления элементов управления в форму выполните следующие действия:

  • Откройте MyControl1 в конструкторе.

Добавьте в форму пять элементов управления Label и соответствующие им элементы управления TextBox с такими же размерами и положением, как на предыдущем рисунке. В примере элементы управления TextBox называются:

  • txtName

  • txtAddress

  • txtCity

  • txtState

  • txtZip

Добавьте два элемента управления Button с заголовками ОК и Отмена. В примере кнопки соответственно называются btnOK и btnCancel.

Реализация кода поддержки

Откройте форму в представлении кода. Элемент управления возвращает введенные данные на узел путем вызова пользовательского события OnButtonClick. Данные содержатся в объекте аргумента события. В следующем примере кода показано объявление события и делегата.

Добавьте в класс MyControl1 следующий код.

Public Delegate Sub MyControlEventHandler(ByVal sender As Object, ByVal args As MyControlEventArgs)
Public Event OnButtonClick As MyControlEventHandler
public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;

Класс MyControlEventArgs содержит сведения, которые нужно вернуть на узел.

Добавьте в форму следующий класс.

Public Class MyControlEventArgs
    Inherits EventArgs
    Private _Name As String
    Private _StreetAddress As String
    Private _City As String
    Private _State As String
    Private _Zip As String
    Private _IsOK As Boolean


    Public Sub New(ByVal result As Boolean, ByVal name As String, ByVal address As String, ByVal city As String, ByVal state As String, ByVal zip As String) 
        _IsOK = result
        _Name = name
        _StreetAddress = address
        _City = city
        _State = state
        _Zip = zip

    End Sub


    Public Property MyName() As String 
        Get
            Return _Name
        End Get
        Set
            _Name = value
        End Set
    End Property

    Public Property MyStreetAddress() As String 
        Get
            Return _StreetAddress
        End Get
        Set
            _StreetAddress = value
        End Set
    End Property

    Public Property MyCity() As String 
        Get
            Return _City
        End Get
        Set
            _City = value
        End Set
    End Property

    Public Property MyState() As String 
        Get
            Return _State
        End Get
        Set
            _State = value
        End Set
    End Property

    Public Property MyZip() As String 
        Get
            Return _Zip
        End Get
        Set
            _Zip = value
        End Set
    End Property

    Public Property IsOK() As Boolean 
        Get
            Return _IsOK
        End Get
        Set
            _IsOK = value
        End Set
    End Property
End Class
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; }
    }
}

Когда пользователь нажимает кнопку ОК или Отмена, обработчики событий Click создают объект MyControlEventArgs, содержащий данные, и вызывает событие OnButtonClick. Единственным отличием между двумя обработчиками является свойство IsOK аргумента события. Это свойство позволяет узлу определить, какая кнопка была нажата. Оно имеет значение true для кнопки ОК и false для кнопки Отмена. В следующем коде показаны два обработчика кнопок.

Добавьте в класс MyControl1 следующий код.

Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click

    Dim retvals As New MyControlEventArgs(True, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub

Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    Dim retvals As New MyControlEventArgs(False, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub
private void btnOK_Click(object sender, System.EventArgs e)
{

    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

private void btnCancel_Click(object sender, System.EventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(false,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

Задание сборки строгого имени и построение сборки

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

  1. Откройте командную строку Visual Studio. Для этого нажмите кнопку Пуск и выберите Все программы/Microsoft Visual Studio 2010/Visual Studio Tools/Командная строка Visual Studio. Будет запущено окно консоли с настраиваемыми переменными среды.

  2. В командной строке перейдите к папке проекта с помощью команды cd.

  3. Создайте файл ключа с именем MyControls.snk, выполнив следующую команду.

    Sn.exe -k MyControls.snk
    
  4. Чтобы включить файл ключа в проект, щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите пункт Свойства. На вкладке Добавление подписи конструктора проектов установите флажок Подписать сборку и перейдите к файлу ключа.

  5. Выполните построение решения. Построение создаст DLL с именем MyControls.dll.

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

Хост-приложение WPF использует элемент управления WindowsFormsHost для размещения MyControl1. Приложение обрабатывает событие OnButtonClick для получения данных из элемента управления. В нем также есть набор переключателей, позволяющих изменить некоторые свойства элемента управления в приложении WPF. Ниже показано завершенное приложение.

Завершенное приложение, в котором отображается элемент управления, внедренный в приложение WPF

Элемент управления, встроенный в страницу WPF

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

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

  1. Откройте Visual Studio и выберите Создать проект.

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

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

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

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

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

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

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

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

  4. Добавьте ссылку на сборку WindowsFormsIntegration, которая называется WindowsFormsIntegration.dll.

Реализация базовой разметки

user interface (UI) ведущего приложения реализуется в файле MainWindow.xaml. Этот файл содержит разметку Extensible Application Markup Language (XAML), которая определяет макет и размещает элемент управления Windows Forms. Приложение разделено на три области.

  • Панель Свойства элемента управления, которая содержит коллекцию переключателей, которые можно использовать для изменения различных свойств размещаемого элемента управления.

  • Панель Данные элемента управления, которая содержит несколько элементов TextBlock, отображающих возвращаемые данные размещенного элемента управления.

  • Сам размещаемый элемент управления.

В следующем коде XAML показан базовый макет. Разметка, необходимая для размещения элемента управления MyControl1, опущена в этом примере, но будет рассмотрена позднее.

Замените код XAML в файле MainWindow.xaml следующим кодом. Если используется язык Visual Basic, измените класс на x:Class="MainWindow".

<Window xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
  <DockPanel>
    <DockPanel.Resources>
      <Style x:Key="inlineText" TargetType="{x:Type Inline}">
        <Setter Property="FontWeight" Value="Normal"/>
      </Style>
      <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Margin" Value="10,5,10,0"/>
      </Style>
    </DockPanel.Resources>

    <StackPanel Orientation="Vertical"
                DockPanel.Dock="Left"
                Background="Bisque"
                Width="250">

      <TextBlock  Margin="10,10,10,10"
                  FontWeight="Bold"
                  FontSize="12">Control Properties</TextBlock>
      <TextBlock Style="{StaticResource titleText}">Background Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalBackColor"
                    IsChecked="True"
                    Click="BackColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnBackGreen"
                    Click="BackColorChanged">LightGreen</RadioButton>
        <RadioButton Name="rdbtnBackSalmon"
                    Click="BackColorChanged">LightSalmon</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Foreground Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalForeColor"
                    IsChecked="True"
                    Click="ForeColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnForeRed"
                    Click="ForeColorChanged">Red</RadioButton>
        <RadioButton Name="rdbtnForeYellow"
                    Click="ForeColorChanged">Yellow</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Family</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalFamily"
                     IsChecked="True"
                    Click="FontChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTimes"
                    Click="FontChanged">Times New Roman</RadioButton>
        <RadioButton Name="rdbtnWingdings"
                    Click="FontChanged">Wingdings</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Size</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalSize"
                    IsChecked="True"
                    Click="FontSizeChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTen"
                    Click="FontSizeChanged">10</RadioButton>
        <RadioButton Name="rdbtnTwelve"
                    Click="FontSizeChanged">12</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Style</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnNormalStyle"
                     IsChecked="True"
                     Click="StyleChanged">Original</RadioButton>
        <RadioButton Name="rdbtnItalic"
                     Click="StyleChanged">Italic</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Weight</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalWeight"
                     IsChecked="True"
                   Click="WeightChanged">
          Original
        </RadioButton>
        <RadioButton Name="rdbtnBold"
                   Click="WeightChanged">Bold</RadioButton>
      </StackPanel>
    </StackPanel>

    <WindowsFormsHost Name="wfh"
                     DockPanel.Dock="Top"
                     Height="300">
      <mcl:MyControl1 Name="mc"/>
    </WindowsFormsHost>

    <StackPanel Orientation="Vertical"
                Height="Auto"
                Background="LightBlue">
      <TextBlock Margin="10,10,10,10"
            FontWeight="Bold"
            FontSize="12">Data From Control</TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Name: <Span Name="txtName" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Street Address: <Span Name="txtAddress" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        City: <Span Name="txtCity" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        State: <Span Name="txtState" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Zip: <Span Name="txtZip" Style="{StaticResource inlineText}"/>
      </TextBlock>
    </StackPanel>
  </DockPanel>
</Window>

Первый элемент StackPanel содержит несколько наборов элементов управления RadioButton, позволяющих изменять различные свойства по умолчанию размещаемого элемента управления. Затем следует элемент WindowsFormsHost, который содержит MyControl1. Последний элемент StackPanel содержит несколько элементов TextBlock, отображающих данные, возвращаемые размещаемым элементом управления. Порядок элементов и параметров атрибутов Dock и Height внедряет размещаемый элемент управления в окно без пропусков или искажения.

Размещение элемента управления

В следующей измененной версии предыдущего кода XAML уделяется внимание элементам, необходимым для размещения элемента управления MyControl1.

<Window xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">


...


<WindowsFormsHost Name="wfh"
                 DockPanel.Dock="Top"
                 Height="300">
  <mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>

Атрибут сопоставления пространства имен xmlns создает ссылку на пространство имен MyControls, содержащее размещаемый элемент управления. Такое сопоставление позволяет представлять MyControl1 в XAML как <mcl:MyControl1>.

Два элемента в коде XAML обрабатывают размещение:

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

  • mcl:MyControl1, который представляет MyControl1, добавляется к дочерней коллекции элемента WindowsFormsHost. В результате этот элемент управления Windows Forms отображается как часть окна WPF, и с элементом управления можно взаимодействовать из приложения.

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

Файл кода программной части MainWindow.xaml.vb или MainWindow.xaml.cs содержит процедурный код, реализующий функциональные возможности UI, рассмотренные в предыдущем разделе. Основные задачи:

  • Присоединение обработчика событий к событию MyControl1 OnButtonClick.

  • Изменение различных свойств MyControl1 в зависимости от способа установки коллекции переключателей.

  • Отображение данных, собранных элементом управления.

Инициализация приложения

Код инициализации содержится в обработчике событий Loaded окна; он присоединяет обработчик событий к событию OnButtonClick элемента управления.

В файле MainWindow.xaml.vb или MainWindow.xaml.cs добавьте следующий код в класс MainWindow.

Private app As Application
Private myWindow As Window
Private initFontWeight As FontWeight
Private initFontSize As [Double]
Private initFontStyle As FontStyle
Private initBackBrush As SolidColorBrush
Private initForeBrush As SolidColorBrush
Private initFontFamily As FontFamily
Private UIIsReady As Boolean = False


Private Sub Init(ByVal sender As Object, ByVal e As RoutedEventArgs)
    app = System.Windows.Application.Current
    myWindow = CType(app.MainWindow, Window)
    myWindow.SizeToContent = SizeToContent.WidthAndHeight
    wfh.TabIndex = 10
    initFontSize = wfh.FontSize
    initFontWeight = wfh.FontWeight
    initFontFamily = wfh.FontFamily
    initFontStyle = wfh.FontStyle
    initBackBrush = CType(wfh.Background, SolidColorBrush)
    initForeBrush = CType(wfh.Foreground, SolidColorBrush)

    Dim mc As MyControl1 = wfh.Child

    AddHandler mc.OnButtonClick, AddressOf Pane1_OnButtonClick
    UIIsReady = True

End Sub
private Application app;
private Window myWindow;
FontWeight initFontWeight;
Double initFontSize;
FontStyle initFontStyle;
SolidColorBrush initBackBrush;
SolidColorBrush initForeBrush;
FontFamily initFontFamily;
bool UIIsReady = false;

private void Init(object sender, EventArgs e)
{
    app = System.Windows.Application.Current;
    myWindow = (Window)app.MainWindow;
    myWindow.SizeToContent = SizeToContent.WidthAndHeight;
    wfh.TabIndex = 10;
    initFontSize = wfh.FontSize;
    initFontWeight = wfh.FontWeight;
    initFontFamily = wfh.FontFamily;
    initFontStyle = wfh.FontStyle;
    initBackBrush = (SolidColorBrush)wfh.Background;
    initForeBrush = (SolidColorBrush)wfh.Foreground;
    (wfh.Child as MyControl1).OnButtonClick += new MyControl1.MyControlEventHandler(Pane1_OnButtonClick);
    UIIsReady = true;
}

Поскольку ранее рассмотренный код XAML добавил элемент управления MyControl1 в коллекцию дочерних элементов элемента WindowsFormsHost, можно привести свойство Child элемента WindowsFormsHost, чтобы получить ссылку на элемент управления MyControl1. Затем можно использовать эту ссылку для присоединения обработчика событий к OnButtonClick.

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

Для обеспечения удобного доступа к типам из библиотеки DLL MyControls, добавьте следующий оператор Imports или using в начало файла.

Imports MyControls
using MyControls;

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

MyControl1 вызывает событие OnButtonClick при щелчке по любой из кнопок элемента управления.

Добавьте в класс MainWindow следующий код.

'Handle button clicks on the Windows Form control
Private Sub Pane1_OnButtonClick(ByVal sender As Object, ByVal args As MyControlEventArgs)
    txtName.Inlines.Clear()
    txtAddress.Inlines.Clear()
    txtCity.Inlines.Clear()
    txtState.Inlines.Clear()
    txtZip.Inlines.Clear()

    If args.IsOK Then
        txtName.Inlines.Add(" " + args.MyName)
        txtAddress.Inlines.Add(" " + args.MyStreetAddress)
        txtCity.Inlines.Add(" " + args.MyCity)
        txtState.Inlines.Add(" " + args.MyState)
        txtZip.Inlines.Add(" " + args.MyZip)
    End If

End Sub
//Handle button clicks on the Windows Form control
private void Pane1_OnButtonClick(object sender, MyControlEventArgs args)
{
    txtName.Inlines.Clear();
    txtAddress.Inlines.Clear();
    txtCity.Inlines.Clear();
    txtState.Inlines.Clear();
    txtZip.Inlines.Clear();

    if (args.IsOK)
    {
        txtName.Inlines.Add( " " + args.MyName );
        txtAddress.Inlines.Add( " " + args.MyStreetAddress );
        txtCity.Inlines.Add( " " + args.MyCity );
        txtState.Inlines.Add( " " + args.MyState );
        txtZip.Inlines.Add( " " + args.MyZip );
    }
}

Данные в текстовых полях упаковываются в объект MyControlEventArgs. При нажатии кнопки ОК обработчик событий извлекает данные и отображает их на панели ниже MyControl1.

Изменение свойств элемента управления

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

Добавьте в класс MainWindow следующий код.

Private Sub BackColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)

    If sender.Equals(rdbtnBackGreen) Then
        wfh.Background = New SolidColorBrush(Colors.LightGreen)
    ElseIf sender.Equals(rdbtnBackSalmon) Then
        wfh.Background = New SolidColorBrush(Colors.LightSalmon)
    ElseIf UIIsReady = True Then
        wfh.Background = initBackBrush
    End If

End Sub

Private Sub ForeColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnForeRed) Then
        wfh.Foreground = New SolidColorBrush(Colors.Red)
    ElseIf sender.Equals(rdbtnForeYellow) Then
        wfh.Foreground = New SolidColorBrush(Colors.Yellow)
    ElseIf UIIsReady = True Then
        wfh.Foreground = initForeBrush
    End If

End Sub

Private Sub FontChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTimes) Then
        wfh.FontFamily = New FontFamily("Times New Roman")
    ElseIf sender.Equals(rdbtnWingdings) Then
        wfh.FontFamily = New FontFamily("Wingdings")
    ElseIf UIIsReady = True Then
        wfh.FontFamily = initFontFamily
    End If

End Sub

Private Sub FontSizeChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTen) Then
        wfh.FontSize = 10
    ElseIf sender.Equals(rdbtnTwelve) Then
        wfh.FontSize = 12
    ElseIf UIIsReady = True Then
        wfh.FontSize = initFontSize
    End If

End Sub

Private Sub StyleChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnItalic) Then
        wfh.FontStyle = FontStyles.Italic
    ElseIf UIIsReady = True Then
        wfh.FontStyle = initFontStyle
    End If

End Sub

Private Sub WeightChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnBold) Then
        wfh.FontWeight = FontWeights.Bold
    ElseIf UIIsReady = True Then
        wfh.FontWeight = initFontWeight
    End If

End Sub
private void BackColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBackGreen)
        wfh.Background = new SolidColorBrush(Colors.LightGreen);
    else if (sender == rdbtnBackSalmon)
        wfh.Background = new SolidColorBrush(Colors.LightSalmon);
    else if (UIIsReady == true)
        wfh.Background = initBackBrush;
}

private void ForeColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnForeRed)
        wfh.Foreground = new SolidColorBrush(Colors.Red);
    else if (sender == rdbtnForeYellow)
        wfh.Foreground = new SolidColorBrush(Colors.Yellow);
    else if (UIIsReady == true)
        wfh.Foreground = initForeBrush;
}

private void FontChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTimes)
        wfh.FontFamily = new FontFamily("Times New Roman");
    else if (sender == rdbtnWingdings)
        wfh.FontFamily = new FontFamily("Wingdings");
    else if (UIIsReady == true)
        wfh.FontFamily = initFontFamily;
}
private void FontSizeChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTen)
        wfh.FontSize = 10;
    else if (sender == rdbtnTwelve)
        wfh.FontSize = 12;
    else if (UIIsReady == true)
        wfh.FontSize = initFontSize;
}
private void StyleChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnItalic)
        wfh.FontStyle = FontStyles.Italic;
    else if (UIIsReady == true)
        wfh.FontStyle = initFontStyle;
}
private void WeightChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBold)
        wfh.FontWeight = FontWeights.Bold;
    else if (UIIsReady == true)
        wfh.FontWeight = initFontWeight;
}

Постройте и запустите приложение. Добавьте произвольный текст в составной элемент управления Windows Forms и нажмите кнопку OK. Этот текст появится в подписях. Щелкайте различные переключатели, чтобы увидеть соответствующий эффект в элементе управления.

См. также

Задачи

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

Ссылки

ElementHost

WindowsFormsHost

Основные понятия

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

Другие ресурсы

Конструктор WPF

Журнал изменений

Дата

Журнал

Причина

Август 2010 г.

Обновлено для Visual Studio 2010.

Обратная связь от клиента.