操作指南:在 WPF 中托管 Windows 窗体复合控件

Windows Presentation Foundation (WPF)提供了用于创建应用程序的丰富环境。 但是,当你对 Windows 窗体代码进行大量投资时,在 WPF 应用程序中至少重复使用其中一些代码,而不是从头开始重写它会更有效。 最常见的情况是你拥有现有的 Windows 窗体控件。 在某些情况下,你甚至可能无权访问这些控件的源代码。 WPF 提供了在 WPF 应用程序中托管此类控件的简单过程。 例如,您可以主要使用 WPF 进行编程,同时托管您的专用 DataGridView 控件。

本演练逐步讲解一个应用程序,该应用程序承载一个 Windows 窗体复合控件,以便在 WPF 应用程序中进行数据输入。 复合控件打包在 DLL 中。 此常规过程可以扩展到更复杂的应用程序和控件。 此演练在外观和功能上设计为几乎与演练:在 Windows 窗体中托管 WPF 复合控件完全相同。 主要区别在于,托管方案是反向的。

本演练分为两个部分。 第一部分简要介绍了 Windows 窗体复合控件的实现。 第二节详细介绍了如何在 WPF 应用程序中托管复合控件、从控件接收事件以及访问控件的某些属性。

本演练涉及以下任务:

  • 实现 Windows 窗体复合控件的过程。

  • 实现 WPF 主机应用程序。

有关本演练中演示的任务的完整代码列表,请参阅 在 WPF 示例中托管 Windows 窗体复合控件

先决条件

需要 Visual Studio 才能完成本演练。

构建 Windows 窗体复合控件

此示例中使用的 Windows 窗体复合控件是一个简单的数据输入窗体。 此窗体获取用户的姓名和地址,然后使用自定义事件将该信息返回到服务器。 下图显示了已呈现的控件。

下图展示了一个 Windows Forms 复合控件:

一张显示简单 Windows 窗体控件的屏幕截图。

创建项目

若要启动项目,请执行以下步骤:

  1. 启动 Visual Studio,然后打开“ 新建项目 ”对话框。

  2. 在“窗口”类别中,选择 Windows 窗体控件库 模板。

  3. 将新项目 MyControls命名为 。

  4. 对于位置,请指定一个方便命名的顶级文件夹,例如 WpfHostingWindowsFormsControl。 稍后,将主机应用程序放入此文件夹中。

  5. 单击 确定 以创建项目。 默认项目包含一个名为 UserControl1 的控件。

  6. 在解决方案资源管理器中,重命名 UserControl1MyControl1.

项目应具有对以下系统 DLL 的引用。 如果默认情况下不包含其中任一 DLL,请将其添加到项目中。

  • 系统

  • System.Data

  • System.Drawing

  • System.Windows.Forms

  • System.Xml

向窗体添加控件

若要向窗体添加控件,请执行以下步骤:

  • 在设计器中打开 MyControl1

在窗体上,添加五个 Label 控件及其相应的 TextBox 控件,按照如上图所示的大小和排列方式。 在此示例中,控件 TextBox 命名为:

  • txtName

  • txtAddress

  • txtCity

  • txtState

  • txtZip

添加标记为“确定”和“取消”的两Button个控件。 在此示例中,按钮名称分别为 btnOKbtnCancel

实施辅助代码

在代码视图中打开窗体。 该控件通过引发自定义 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 工具/Visual Studio 命令提示符”。 这会启动具有自定义环境变量的控制台窗口。

  2. 在命令提示符下,使用 cd 命令转到项目文件夹。

  3. 运行以下命令,生成名为 MyControls.snk 的密钥文件。

    Sn.exe -k MyControls.snk
    
  4. 若要在项目中包括密钥文件,请在解决方案资源管理器中右键单击项目名称,然后单击“ 属性”。 在项目设计器中,单击“ 签名 ”选项卡,选中“ 对程序集进行签名 ”复选框,然后浏览到密钥文件。

  5. 生成解决方案。 构建将生成一个名为 MyControls.dll的 DLL。

实现 WPF 主机应用程序

WPF 主机应用程序使用 WindowsFormsHost 控件来承载 MyControl1。 应用程序处理 OnButtonClick 事件以从控件接收数据。 它还包含一组选项按钮,可用于更改 WPF 应用程序中的一些控件属性。 下图显示了已完成的应用程序。

下图显示了完整的应用程序,包括 WPF 应用程序中嵌入的控件:

显示 WPF 页面中嵌入的控件的屏幕截图。

创建项目

若要启动项目,请执行以下步骤:

  1. 打开 Visual Studio,然后选择“ 新建项目”。

  2. 在“窗口”类别中,选择 WPF 应用程序 模板。

  3. 将新项目 WpfHost命名为 。

  4. 对于位置,请指定包含 MyControls 项目的同一顶级文件夹。

  5. 单击 确定 以创建项目。

您还需要添加对包含 MyControl1 及其他程序集的 DLL 的引用。

  1. 右键单击解决方案资源管理器中的项目名称,然后选择“ 添加引用”。

  2. 单击“ 浏览 ”选项卡,并浏览到包含 MyControls.dll的文件夹。 在本演练中,此文件夹为 MyControls\bin\Debug。

  3. 选择 MyControls.dll,然后单击“ 确定”。

  4. 添加对名为 WindowsFormsIntegration.dll的 WindowsFormsIntegration 程序集的引用。

实现基本布局

主机应用程序的用户界面(UI)在 MainWindow.xaml 中实现。 此文件包含可扩展应用程序标记语言(XAML)标记,用于定义布局并托管 Windows 窗体控件。 应用程序分为三个区域:

  • “控件属性”面板,其中包含可用于修改托管控件的各种属性的选项按钮的集合。

  • “控制面板中的数据”,其中包含显示从托管控件返回的数据的多个TextBlock元素。

  • 托管控件本身。

基本布局显示在以下 XAML 中。 在此示例中省去了托管 MyControl1 所需的标记,但稍后会对此进行讨论。

将 MainWindow.xaml 中的 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 ,可用于修改托管控件的各种默认属性。 一个承载MyControl1的元素后面跟着WindowsFormsHost。 最后 StackPanel 一个元素包含多个 TextBlock 元素,这些元素显示托管控件返回的数据。 元素DockHeight和属性设置的排序将托管控件嵌入到窗口中,没有任何间隙或失真。

托管控件

以下编辑后的 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 的引用。 通过此映射,可以在 XAML 中表示 MyControl1<mcl:MyControl1>.

XAML 中的两个元素处理宿主功能:

  • WindowsFormsHost 表示 WindowsFormsHost 可用于在 WPF 应用程序中托管 Windows 窗体控件的元素。

  • mcl:MyControl1,表示 MyControl1,将添加到 WindowsFormsHost 元素的子集合中。 因此,此 Windows 窗体控件将呈现为 WPF 窗口的一部分,你可以从应用程序与控件通信。

实现 Code-Behind 文件

代码隐藏文件(MainWindow.xaml.vb或MainWindow.xaml.cs)包含实现上一部分中讨论的 UI 功能的过程代码。 主要任务包括:

  • 将事件处理程序附加到 MyControl1's OnButtonClick 事件。

  • 根据选项按钮集合的设置方式,修改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 还公开了一些控件的属性,您可以在应用程序中进行操作。 初始化代码将这些值分配给专用全局变量,供以后在应用程序中使用。

因此,可以轻松访问 DLL 中的 MyControls 类型,请将以下 Importsusing 语句添加到文件顶部。

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 窗体复合控件中添加一些文本,然后单击“ 确定”。 文本显示在标签中。 单击不同的单选按钮,以观察其对控件的影响。

另请参阅