演练:在 WPF 中承载 Windows 窗体复合控件

更新:2010 年 8 月

Windows Presentation Foundation (WPF) 提供用于创建应用程序的丰富环境。 但是,如果您对 Windows Forms代码的投入较大,那么更有效的办法是在您的 WPF 应用程序中至少重用该代码的一部分,而不是从头开始重新编写应用程序。 最常见的情况是您有现有的 Windows Forms控件。 在某些情况下,您可能甚至没有对这些控件的源代码的访问权。 WPF 提供了一个在 WPF 应用程序中承载此类控件的简单过程。 例如,您可以在承载专用的 DataGridView 控件时,将 WPF 用于大多数编程。

本演练引导您创建一个应用程序,该应用程序承载 Windows Forms复合控件以在 WPF 应用程序程序中执行数据输入。 该复合控件打包到一个 DLL 中。 该一般过程可以扩展到更复杂的应用程序和控件。 本演练的设计在外观与功能上与演练:在 Windows 窗体中承载 WPF 复合控件几乎完全相同。 主要区别在于承载方案是相反的。

本演练分为两部分。 第一部分简要介绍 Windows Forms复合控件的实现。 第二部分详细讨论如何在 WPF 应用程序中承载该复合控件、从该控件接收事件以及访问该控件的一些属性。

本演练涉及以下任务:

  • 实现 Windows 窗体复合控件。

  • 实现 WPF 宿主应用程序。

有关本演练中所阐释任务的完整代码清单,请参见 Hosting a Windows Forms Composite Control in WPF Sample(在 WPF 中承载 Windows 窗体复合控件示例)。

系统必备组件

您需要以下组件来完成本演练:

  • Visual Studio 2010.

实现 Windows 窗体复合控件

本示例中使用的 Windows Forms复合控件是一个简单的数据输入窗体。 该窗体接受用户的名称和地址,然后使用自定义事件将此信息返回到宿主。 下图演示呈现的控件。

Windows 窗体复合控件

简单的 Windows 窗体控件

创建项目

若要开始创建项目,请执行以下操作:

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

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

  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

添加两个标有**“OK”(确定)“Cancel”(取消)**的 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; }
    }
}

用户单击**“OK”(确定)“Cancel”(取消)按钮时,Click 事件处理程序创建一个 MyControlEventArgs 对象,该对象包含这些数据并引发 OnButtonClick 事件。 两个处理程序的唯一区别在于事件参数的 IsOK 属性。 通过该属性,宿主可以确定单击了哪个按钮。 对于“OK”(确定)按钮,它设置为 true,对于“Cancel”(取消)**按钮,则设置为 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 工具”/“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 程序集的引用。

实现基本布局

宿主应用程序的user interface (UI) 在 MainWindow.xaml 中实现。 此文件包含定义布局并承载 Windows Forms控件的Extensible Application Markup Language (XAML) 标记。 应用程序分为三个区域:

  • **“控件属性”**面板,该面板包含可用于修改所承载控件的各个属性的选项按钮集合。

  • **“来自控件的数据”**面板,该面板包含若干显示从所承载控件返回的数据的 TextBlock 元素。

  • 所承载的控件自身。

下面的 XAML 显示了基本布局。 此示例省略了承载 MyControl1 所需的标记,但后面将对其进行讨论。

用以下内容替换 MainWindow.xaml 中的 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 元素。 这些元素的排序以及 DockHeight 特性设置无间隙并且不失真地将所承载的控件嵌入到窗口中。

承载控件

下面是上一个 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 命名空间的引用。 通过该映射,可以在 XAML 中将 MyControl1 表示为 <mcl:MyControl1>。

此 XAML 中的以下两个元素处理承载:

  • WindowsFormsHost 表示 WindowsFormsHost 元素,通过该元素可以在 WPF 应用程序中承载 Windows Forms控件。

  • 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 元素的子元素集合中,因此您可以强制转换 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 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 对象中。 如果用户单击**“OK”(确定)**按钮,事件处理程序将提取数据,并在 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 窗体复合控件中添加一些文本,然后单击**“确定”**。 该文本会显示在标签中。 单击不同的单选按钮以查看对控件的效果。

请参见

任务

演练:在 WPF 中承载 Windows 窗体控件

参考

ElementHost

WindowsFormsHost

概念

演练:在 Windows 窗体中承载 WPF 复合控件

其他资源

WPF 设计器

修订记录

日期

修订记录

原因

2010 年 8 月

针对 Visual Studio 2010 进行了更新。

客户反馈