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

Windows Presentation Foundation (WPF)提供了用于创建应用程序的丰富环境。 但是,当你对 Windows 窗体代码进行大量投资时,使用 WPF 扩展现有 Windows 窗体应用程序,而不是从头开始重写它可能更有效。 一种常见方案是在 Windows 窗体应用程序中嵌入使用 WPF 实现的一个或多个控件。 有关自定义 WPF 控件的详细信息,请参阅 控件自定义

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

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

本演练涉及以下任务:

  • 实现 WPF 复合控件。

  • 实现 Windows 窗体宿主应用程序。

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

先决条件

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

实现 WPF 组合控件

此示例中使用的 WPF 复合控件是一种采用用户名和地址的简单数据输入窗体。 当用户单击两个按钮之一以指示任务已完成时,控件将引发一个自定义事件,以将该信息返回到主机。 下图显示了已呈现的控件。

下图显示了 WPF 复合控件:

显示简单 WPF 控件的屏幕截图。

创建项目

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

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

  2. 在 Visual C# 和 Windows 类别中,选择 WPF 用户控件库 模板。

  3. 将新项目 MyControls命名为 。

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

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

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

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

  • PresentationCore

  • PresentationFramework

  • 系统

  • WindowsBase

创建用户界面

复合控件的用户界面(UI)是使用可扩展应用程序标记语言(XAML)实现的。 复合控件 UI 由五 TextBox 个元素组成。 每个 TextBox 元素都有一个用作标签的关联 TextBlock 元素。 底部有两 Button 个元素: “确定 ”和 “取消”。 当用户单击任一按钮时,控件将引发自定义事件以将信息返回到主机。

基本布局

各种 UI 元素包含在元素 Grid 中。 可以使用 Grid 以类似于在 HTML 中使用 Table 元素的方式来排列复合控件的内容。 WPF 还有一个 Table 元素,但 Grid 更轻量,更适合简单的布局任务。

以下 XAML 显示了基本布局。 此 XAML 通过指定元素中的 Grid 列数和行数来定义控件的整体结构。

在 MyControl1.xaml 中,将现有 XAML 替换为以下 XAML。

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

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

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

将 TextBlock 和 TextBox 元素添加到网格

通过设置 UI 元素的 RowProperty 行号属性和 ColumnProperty 列号属性,将其放置在网格中。 请记住,行和列编号是从零开始的。 可以通过设置元素的 ColumnSpanProperty 属性,使其能够跨越多个列。 有关元素的详细信息 Grid ,请参阅 “创建网格元素”。

以下 XAML 显示复合控件的TextBoxTextBlock 元素及其 RowPropertyColumnProperty 属性,这些属性用于将元素正确地放置在网格中。

在 MyControl1.xaml 中,在 Grid 元素中添加以下 XAML。

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

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

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

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

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

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

设置 UI 元素的样式

数据输入窗体上的许多元素具有类似的外观,这意味着它们具有多个属性的相同设置。 以前的 XAML 使用 Style 元素来定义元素类的标准属性设置,而不是单独设置每个元素的属性。 此方法可降低控件的复杂性,并使你能够通过单个样式属性更改多个元素的外观。

元素Style包含在元素GridResources属性中,因此控件中的所有元素都可以使用这些元素。 如果样式有名称,则通过添加一个样式名为该名称的 Style 元素,将其应用于元素。 未命名的样式将成为元素的默认样式。 有关 WPF 样式的详细信息,请参阅 样式设置和模板化

以下 XAML 显示 Style 复合控件的元素。 若要查看样式如何应用于元素,请参阅前面的 XAML。 例如,最后 TextBlock 一个元素具有 inlineText 样式,最后 TextBox 一个元素使用默认样式。

在 MyControl1.xaml 中,在 start 元素后面 Grid 添加以下 XAML。

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

添加“确定”和“取消”按钮

复合控件上的最后一个元素是 OKCancelButton 元素,它占据最后一行 Grid的前两列。 这些元素使用通用事件处理程序, ButtonClicked以及上一 XAML 中定义的默认 Button 样式。

在 MyControl1.xaml 中,在最后 TextBox 一个元素后面添加以下 XAML。 复合控件的 XAML 部分现已完成。

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

实现 Code-Behind 文件

代码隐藏文件(MyControl1.xaml.cs)实现三项基本任务:

  1. 处理当用户单击其中一个按钮时发生的事件。

  2. TextBox 元素中检索数据,并将其打包到自定义事件参数对象中。

  3. 引发自定义 OnButtonClick 事件,该事件通知主机用户已完成并将数据传回主机。

该控件还公开了许多颜色和字体属性,使你能够更改外观。 WindowsFormsHost与用于托管 Windows 窗体控件的类不同,该ElementHost类仅公开控件Background的属性。 为了保持本代码示例与 演练:在 WPF 中托管 Windows 窗体复合控件的示例之间的相似性,该控件直接公开其余属性。

Code-Behind 文件的基本结构

代码隐藏文件由一个命名空间组成, MyControls其中包含两个类, MyControl1 以及 MyControlEventArgs

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

第一个类 MyControl1是包含实现 MyControl1.xaml 中定义的 UI 功能的代码的分部类。 分析 MyControl1.xaml 时,XAML 将转换为同一分部类,并将这两个分部类合并为形成已编译的控件。 因此,代码隐藏文件中的类名必须与分配给 MyControl1.xaml 的类名匹配,并且必须继承自控件的根元素。 第二个类 MyControlEventArgs是一个事件参数类,用于将数据发送回主机。

打开MyControl1.xaml.cs。 更改现有类声明,使其具有以下名称和继承自 Grid

public partial class MyControl1 : Grid

初始化控件

以下代码实现多个基本任务:

  • 声明私有事件OnButtonClick及其关联的委托MyControlEventHandler

  • 创建多个用于存储用户数据的私有全局变量。 此数据通过相应的属性公开。

  • 实现控件Loaded事件的处理程序Init。 此处理程序通过为其分配 MyControl1.xaml 中定义的值来初始化全局变量。 为此,它使用分配给典型TextBlock元素的Name,以访问该元素的nameLabel属性设置。

删除现有构造函数,并将以下代码添加到类 MyControl1

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

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

处理按钮的单击事件

用户通过单击“ 确定 ”按钮或“ 取消 ”按钮指示数据输入任务已完成。 这两个Click按钮使用相同的事件处理程序。 ButtonClicked 这两个按钮都有一个名称, btnOK 或者 btnCancel,通过检查参数的值,处理程序可以确定单击哪个 sender 按钮。 处理程序执行以下操作:

  • 创建一个 MyControlEventArgs 对象,其中包含TextBox元素中的数据。

  • 如果用户单击了 “取消 ”按钮,将 MyControlEventArgs 对象的 IsOK 属性设置为 false

  • OnButtonClick引发事件以向主机指示用户已完成,并传回收集的数据。

将以下代码添加到MyControl1类中,在Init方法之后。

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

创建属性

类的其余部分只公开与前面讨论的全局变量对应的属性。 当属性发生更改时,set 访问器通过更改相应的元素属性和更新基础全局变量来修改控件的外观。

将以下代码添加到类 MyControl1

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

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

将数据发送回主机

文件中的最后一个组件是 MyControlEventArgs 类,该类用于将收集的数据发送回主机。

将以下代码添加到 MyControls 命名空间。 实现非常简单,不会进一步讨论。

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

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

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

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

实现 Windows 窗体主机应用程序

Windows 窗体主机应用程序使用对象 ElementHost 来托管 WPF 复合控件。 应用程序处理 OnButtonClick 事件以从复合控件接收数据。 该应用程序还有一组选项按钮,可用于修改控件的外观。 下图显示了应用程序。

以下图像展示了一个在 Windows 窗体应用程序中托管的 WPF 组合控件

显示托管 Avalon 控件的 Windows 窗体的屏幕截图。

创建项目

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

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

  2. 在 Visual C# 和 Windows 类别中,选择 Windows 窗体应用程序 模板。

  3. 将新项目 WFHost命名为 。

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

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

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

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

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

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

  4. 添加对以下程序集的引用。

    • PresentationCore

    • PresentationFramework

    • System.Xaml

    • WindowsBase

    • WindowsFormsIntegration

实现应用程序的用户界面

Windows 窗体应用程序的 UI 包含多个与 WPF 复合控件交互的控件。

  1. 在 Windows 窗体设计器中打开 Form1。

  2. 放大窗体以适应控件。

  3. 在窗体的右上角,添加一个 System.Windows.Forms.Panel 控件来保存 WPF 复合控件。

  4. 将以下 System.Windows.Forms.GroupBox 控件添加到窗体。

    名称 文本
    groupBox1 背景色
    groupBox2 前景色
    组框3 字体大小
    groupBox4 字体系列
    groupBox5 字形
    groupBox6 字体粗细程度
    groupBox7 来自控件的数据
  5. 将以下 System.Windows.Forms.RadioButton 控件添加到 System.Windows.Forms.GroupBox 控件。

    GroupBox 名称 文本
    groupBox1 原始广播背景 原版
    groupBox1 广播背景浅绿色 浅绿色
    groupBox1 单选按钮背景浅鲑红色 LightSalmon
    groupBox2 radioForegroundOriginal 原版
    groupBox2 radioForegroundRed 红色
    groupBox2 radioForegroundYellow 黄色
    groupBox3 radioSizeOriginal 原版
    groupBox3 radioSizeTen 10
    groupBox3 radioSizeTwelve 12
    groupBox4 radioFamilyOriginal 原版
    groupBox4 radioFamilyTimes Times New Roman
    groupBox4 radioFamilyWingDings WingDings
    groupBox5 radioStyleOriginal 正常
    groupBox5 radioStyleItalic 斜体
    groupBox6 radioWeightOriginal 原版
    groupBox6 radioWeightBold 加粗
  6. 将以下 System.Windows.Forms.Label 控件添加到最后的 System.Windows.Forms.GroupBox。 这些控件显示 WPF 复合控件返回的数据。

    GroupBox 名称 文本
    groupBox7 lblName 姓名:
    groupBox7 lblAddress 街道地址:
    groupBox7 lblCity 城市:
    groupBox7 lblState 状态:
    groupBox7 lblZip 邮政编码:

初始化窗体

通常,在表单的 Load 事件处理程序中实现宿主代码。 以下代码显示了 Load 事件处理程序、WPF 复合控件事件的 Loaded 处理程序,以及稍后使用的多个全局变量的声明。

在 Windows 窗体设计器中,双击窗体以创建 Load 事件处理程序。 在Form1.cs顶部,添加以下 using 语句。

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

将现有 Form1 类的内容替换为以下代码。

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

public Form1()
{
    InitializeComponent();
}

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

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

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

Form1_Load上述代码中的方法显示了承载 WPF 控件的一般过程:

  1. 创建一个新的 ElementHost 对象。

  2. 将控件的 Dock 属性设置为 DockStyle.Fill

  3. ElementHost 控件添加到 Panel 控件的 Controls 集合中。

  4. 创建 WPF 控件的实例。

  5. 在窗体上托管复合控件,通过将复合控件分配给控件ElementHostChild的属性。

方法中的 Form1_Load 其余两行将事件处理程序绑定到两个控件事件:

  • OnButtonClick 是当用户单击 “确定 ”或“ 取消 ”按钮时复合控件触发的自定义事件。 处理事件以获取用户的响应并收集用户指定的任何数据。

  • Loaded 是 WPF 控件在完全加载时引发的标准事件。 此处使用了该事件,因为该示例需要使用控件中的属性初始化多个全局变量。 在窗体发生 Load 事件时,控件尚未完全加载,并且这些值仍然保持为 null。 需要等到控件 Loaded 的事件发生,然后才能访问这些属性。

Loaded事件处理程序显示在前面的代码中。 将在下一部分讨论 OnButtonClick 处理程序。

处理 OnButtonClick

当用户 OnButtonClick 单击“ 确定 ”或“ 取消 ”按钮时发生该事件。

事件处理程序检查事件参数的 IsOK 字段,以确定单击了哪个按钮。 数据lbl变量对应于Label前面讨论的控件。 如果用户单击 “确定 ”按钮,则控件控件 TextBox 中的数据将分配给相应的 Label 控件。 如果用户单击“ 取消”,则 Text 值将设置为默认字符串。

将以下按钮单击事件处理程序代码添加到 Form1 类。

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

生成并运行应用程序。 在 WPF 复合控件中添加一些文本,然后单击“ 确定”。 文本显示在标签中。 此时,尚未添加代码来处理单选按钮。

修改控件的外观

RadioButton窗体上的控件允许用户更改 WPF 复合控件的前景色、背景色,以及一些字体属性。 ElementHost 对象显示了背景颜色。 其余属性作为控件的自定义属性公开。

双击窗体上的每个 RadioButton 控件以创建 CheckedChanged 事件处理程序。 将 CheckedChanged 事件处理程序替换为以下代码。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

生成并运行应用程序。 单击不同的单选按钮可查看 WPF 复合控件的效果。

另请参阅