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


Пошаговое руководство. Размещение составного элемента управления 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.

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

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

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

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

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

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

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

  2. В категории "Окно" выберите шаблон библиотеки элементов управления 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 void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
Public Delegate Sub MyControlEventHandler(ByVal sender As Object, ByVal args As MyControlEventArgs)
Public Event OnButtonClick As MyControlEventHandler

Класс MyControlEventArgs содержит информацию, которая будет возвращена хосту.

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

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; }
    }
}
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

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

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

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);
}
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

Присвоение сборке сто́кого имени и создание сборки

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

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

  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. В категории "Окно" выберите шаблон приложения WPF .

  3. Назовите новый проект WpfHost.

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

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

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

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

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

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

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

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

Пользовательский интерфейс ведущего приложения реализуется в MainWindow.xaml. Этот файл содержит расширяемую разметку языка разметки приложений (XAML), которая определяет макет и размещает элемент управления Windows Forms. Приложение разделено на три региона:

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

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

  • Хост-элемент управления.

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

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

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://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, и вы можете взаимодействовать с элементом управления из приложения.

Реализация файла Code-Behind

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

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

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

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

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

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

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

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;
}
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

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

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

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

Imports MyControls
using MyControls;

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

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

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

//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 );
    }
}
'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

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

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

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

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

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;
}
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

Создайте и запустите приложение. Добавьте текст в составной элемент управления Windows Forms и нажмите кнопку "ОК". Текст отображается в метках. Щелкните разные переключатели, чтобы увидеть изменения в элементе управления.

См. также