共用方式為


逐步解說:在 Windows Form 中裝載 Windows Presentation Foundation 控制項

更新:2007 年 11 月

Windows Presentation Foundation (WPF) 提供用來建立應用程式的豐富環境。然而,長期開發 Windows Form 程式碼時,更有效的方式是使用 WPF 延伸現有 Windows Form 應用程式,而不是從頭重新撰寫程式碼。常見案例是想要在 Windows Form 應用程式內內嵌使用 WPF 實作的一個或多個頁面時。

這個逐步解說會引導您完成在 Windows Form 應用程式內裝載 WPF 頁面的應用程式。這個頁面是封裝 (Package) 於 DLL 中的簡單資料輸入應用程式。這個範例設計的外觀及功能與在 Windows Presentation Foundation 中裝載 Windows Form 複合控制項範例幾乎完全相同。主要差異是保留了裝載案例。

注意事項:

裝載的頁面嚴格來說並不是 WPF 控制項。而是封裝於 DLL 中的一般 WPF 頁面。然而,在表單上裝載 WPF 控制項的技術與用來裝載一般頁面的技術相同。如需 WPF 控制項的進一步討論,請參閱控制項自訂

逐步解說分成兩個部分。第一個部分簡短說明 WPF 頁面的實作。第二個部分則詳細討論如何在 Windows Form 應用程式中裝載頁面、從頁面接收事件,以及存取部分頁面屬性。

逐步解說將說明的工作包括:

  • 實作 Windows Presentation Foundation 頁面。

  • 實作 Windows Forms 主應用程式 (Host Application)。

如需這個逐步解說中所說明之工作的完整程式碼清單,請參閱在 Windows Form 中裝載簡單的 Windows Presentation Foundation 控制項範例

必要條件

您需要下列元件才能完成此逐步解說:

  • Visual Studio 2008.

實作 Windows Presentation Foundation 頁面

這個範例中使用的 WPF 頁面就是取用使用者名稱和地址的簡單資料輸入表單。當使用者按一下兩個按鈕中的其中一個按鈕表示工作已完成時,頁面會引發自訂事件,將該資訊傳回給主應用程式。這個頁面的表單及函式,與逐步解說:在 Windows Presentation Foundation 中裝載 Windows Form 複合控制項中使用的 Windows Form 控制項實質上相同。並不需要特別自訂頁面,就可以將頁面裝載在 Windows Form 表單中。在大型 WPF 頁面上,也能輕鬆地將它載入至 Frame。下圖顯示呈現的頁面。

Windows Presentation Foundation 頁面

簡單的 WPF 控制項

建立專案

若要啟動此專案:

  1. 啟動 Microsoft Visual Studio,並開啟 [新增專案] 對話方塊。

  2. 選取 [WPF 瀏覽器應用程式] 範本。

  3. 將新專案命名為 MyControls,並將它放在適當命名的最上層資料夾 (例如,WfHostingWpf) 中。稍後,您也會將主應用程式放在這個資料夾中。按一下 [確定],建立專案。預設專案包含一個名為 Page1 的單一頁面。

  4. 以滑鼠右鍵按一下 [方案總管] 中的專案名稱,然後選取 [屬性]。

  5. 將 [輸出類型] 設為 [類別庫],以將頁面編譯為 DLL。

  6. 從專案中刪除應用程式定義檔 MyApp.xaml 及 MyApp.xaml.cs。只有在將頁面實作為應用程式時才需要那些檔案。

注意事項:

將 WPF 應用程式編譯為類別庫 (Class Library) 時,不可以啟動程式庫來檢視呈現的頁面。因此,在完全實作應用程式之前,您會發現將輸出類型保留為 [Windows 應用程式] 是最方便的做法。這可讓您啟動應用程式,以檢查頁面外觀。滿意之後,請刪除應用程式定義檔案,並將輸出類型變更為 [類別庫],將它編譯為 DLL。

您的專案應該參考下列系統 DLL。如果預設未包含下列任一 DLL,請將它們加入至您的專案。

  • System

  • PresentationCore

  • PresentationFramework

  • WindowsBase

實作頁面的使用者介面

WPF 頁面的使用者介面 (UI) 是使用可延伸標記語言 (XAML) 進行實作。它設計的外觀和功能與逐步解說:在 Windows Presentation Foundation 中裝載 Windows Form 複合控制項中討論的 Windows Form 控制項類似。頁面的資料輸入 UI 是由五個 TextBox 項目組成:每個 TextBox 項目都會有當成標籤的相關 TextBlock 項目。頁面底端則有兩個 Button 項目:[確定] 和 [取消]。當使用者按一下任一個按鈕時,頁面會引發自訂事件,將資訊傳回給主應用程式。

基本配置

各種 UI 項目都是包含在 Grid 項目中。使用 Grid 排列頁面內容的方式,與在 HTML 中使用 Table 項目的方式相同。WPF 也具有 Table 項目,但是 Grid 比較輕量,也較適合簡單的配置工作。

下列範例顯示基本配置程式碼。這個程式碼會在 Grid 項目中指定資料行和資料列數目,藉以定義頁面的整體結構。請用它來取代 Page1.xaml 中的程式碼。

<Grid xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="MyControls.Page1"
      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>

將 TextBlock 和 TextBox 項目加入至格線

將項目的 RowPropertyColumnProperty 屬性設為適當的資料列和資料行編號,就可以將 UI 項目放到格線中。請記住,資料列和資料行編號都是以零起始。而設定項目的 ColumnSpanProperty 屬性,則可以讓一個項目跨越多個資料行。如需 Grid 項目的詳細資訊,請參閱 HOW TO:建立 Grid 項目

下列範例顯示頁面的 TextBoxTextBlock 項目與其 RowPropertyColumnProperty 屬性,這些屬性是設為將項目正確地放在格線中。請將這個程式碼加入至 Page1.xaml,就放在 Grid 項目的下面。

<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 項目的樣式

資料輸入表單上許多項目的外觀都類似,這表示它們的一些屬性具有相同的設定。範例程式碼並未個別設定每個項目的屬性 (Attribute),而是使用 Style 項目來定義項目類別的標準屬性 (Property) 設定。這個方式可減少頁面的複雜性,而且可讓您透過單一樣式屬性變更多個項目的外觀。

Style 項目是包含在 Grid 項目的 Resources 屬性中,因此可以供頁面上的所有項目使用。如果樣式已命名,則加入設為這個樣式名稱的 Style 項目,就可以將樣式套用至項目。而未命名的樣式則會變成項目的預設樣式。如需 WPF 樣式的詳細資訊,請參閱設定樣式和範本

下列範例顯示 WPF 頁面的 Style 項目。請將這個程式碼加入至 Page1.xaml,就放在 Grid 項目的下面。若要查看樣式套用至項目的方式,請參閱前一個程式碼範例。例如,最後一個 TextBlock 項目具有 inlineText 樣式,而最後一個 TextBox 項目則使用預設樣式。

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

加入確定和取消按鈕

頁面上的最終項目是 [確定] 和 [取消] Button 項目,這兩個會佔用 Grid 最後一個資料列的前兩個資料行。這些項目會使用通用事件處理常式 ButtonClicked,以及前一個程式碼範例中定義的預設 Button 樣式。請將下列程式碼加入至 Page1.xaml,就放在最終 TextBox 項目的下面。頁面的 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>

實作頁面的程式碼後置檔案

WPF 頁面的程式碼後置 (Code-Behind) 檔案 Page1.xaml.cs 會實作四個基本工作:

  1. 使用 Application 物件登錄頁面的 DLL 名稱,讓它知道要從何處載入頁面。

  2. 處理使用者按一下其中一個按鈕時進行的事件。

  3. TextBox 項目中擷取資料,並將它封裝到自訂事件引數物件中。

  4. 引發自訂 OnButtonClick 事件,用以通知主應用程式使用者已完成,並將資料傳回給主應用程式。

頁面也會公開一些色彩和字型屬性,讓您可以控制頁面的外觀。與用來裝載 Windows Form 控制項的 WindowsFormsHost 類別不同的是,ElementHost 類別只會公開頁面的 Background 屬性。為了維護這個程式碼範例與逐步解說:在 Windows Presentation Foundation 中裝載 Windows Form 複合控制項中所討論範例的類似性,頁面會直接公開其餘屬性。

程式碼後置檔案的基本結構

程式碼後置檔案是由單一命名空間 MyControls 所組成,而這個命名空間包含 Page1 和 MyControlEventArgs 這兩個類別。請用下列程式碼取代 Page1.xaml.cs 中的程式碼。

using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Controls;
using System.Windows.Media;

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

第一個類別 Page1 是部分類別,內含的程式碼可實作 Page1.xaml 中定義之 UI 的功能。剖析 Page1.xaml 時,會將 XAML 轉換為相同的部分類別,而且會合併這兩個部分類別以產生編譯的頁面。因此,程式碼後置檔案中的類別名稱必須符合指派給 Page1.xaml 的類別名稱,而且必須繼承自頁面的根項目。第二個類別 MyControlEventArgs 是事件引數類別,用來將資料傳回給主應用程式。

初始化 Page1 類別

下列程式碼範例會實作數個基本工作:

  • 宣告私用 (Private) 事件 OnButtonClick 和其相關委派 MyControlEventHandler。

  • 建立數個儲存使用者資料的私用全域變數。這個資料是透過對應的屬性所公開。

  • 實作頁面之 Loaded 事件的 Init 處理常式。這個處理常式會將 Page1.xaml 中定義的值指派給全域變數,以初始化全域變數。而做法是使用指派給一般 TextBlock 項目 nameLabel 的 Name,來存取該項目的屬性設定。

將下列程式碼加入至 Page1 類別。

public partial class Page1 : Grid
{
    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 或 btnFalse,讓處理常式只要檢查 sender 引數的值就可以判斷按的是哪一個按鈕。處理常式會執行下列動作:

  • 建立 MyControlEventArgs 物件,內含頁面之 TextBox 項目的資料。

  • 如果使用者按的是 [取消] 按鈕,則會將 MyControlEventArgs 物件的 IsOK 屬性設為 false。

  • 引發 OnButtonClick 事件,告知主應用程式使用者已完成,並傳回收集的資料。

將下列程式碼加入至 Page1 類別,就放在 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 存取子會變更對應的項目屬性,並更新基礎全域變數,以修改頁面的外觀。

將下列程式碼加入至 Page1 類別。

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

實作 Windows Forms 主應用程式

Windows Form 主應用程式使用 ElementHost 物件來裝載表單上的 WPF 頁面。應用程式會處理頁面的 OnButtonClick 事件,以接收來自表單的資料。應用程式也會有一組可用來修改頁面外觀的選項按鈕。下列螢幕擷取畫面顯示所呈現的表單。

裝載在 Windows Forms 應用程式中的 Windows Presentation Foundation 頁面

Windows Form 裝載 Avalon 控制項

建立專案

若要啟動此專案:

  1. 啟動 Visual Studio,並開啟 [新增專案] 對話方塊。

  2. 選取具有 [Windows Forms 應用程式] 範本的 [C# 專案]。

  3. 將新專案命名為 WFHost,並將它放在內含 MyControls 專案的相同最上層資料夾中。按一下 [確定],建立專案。

您也需要加入內含 WPF 頁面之 DLL 的參考:

  1. 按一下 [方案總管] 中的專案名稱,然後選取 [加入參考]。

  2. 按一下 [瀏覽] 索引標籤,然後巡覽至內含 MyControls.dll 的資料夾。

  3. 選取 MyControls.dll,然後按一下 [確定] 將 DLL 加入至參考清單。

  4. 在 [方案總管中],加入名為 WindowsFormsIntegration.dll 之 WindowsFormsIntegration 組件 (Assembly) 的參考。

實作表單的使用者介面設計

開啟 [Windows Form 設計工具],並將表單配置成如同實作 Windows Forms 主應用程式所顯示的示範:

  1. 展開預設表單,以放入控制項和 WPF 頁面。

  2. System.Windows.Forms.Panel 控制項加入至表單的右上角,用以保留 WPF 頁面。

  3. 加入六組 System.Windows.Forms.RadioButton 控制項,如示範中所示。

  4. 將五個 System.Windows.Forms.Label 控制項加入至表單的右下角,如示範中所示。這些控制項是做為 WPF 控制項所傳回資料的標籤。

  5. Label 控制項加入至上個步驟所加入之每個 Label 控制項的右邊。將每個控制項的 Text 屬性設為 ""。這些控制項會顯示 WPF 控制項傳回的資料。

  6. 加入另一個 Label 控制項,做為最後兩個步驟中控制項群組的標題。因為這個 Label 是要做為群組的標題,所以請將字型大小設成比群組中的控制項大兩點。

初始化表單

一般實作的是表單之 Load 事件處理常式中的裝載程式碼。請在 [Windows Forms 設計工具] 中按兩下表單,建立 Load 事件處理常式方法。下列程式碼範例包含範例的 Load 事件處理常式 (WPF 頁面之 Loaded 事件的處理常式),以及之後使用的數個全域變數的宣告。請用下列程式碼取代 Form1.cs 中的程式碼。

partial class Form1 : Form
{
    private ElementHost ctrlHost;
    private MyControls.Page1 wpfAddressCtrl;
    System.Windows.FontWeight initFontWeight;
    double initFontSize;
    System.Windows.FontStyle initFontStyle;
    System.Windows.Media.SolidColorBrush initBackBrush;
    System.Windows.Media.SolidColorBrush initForeBrush;
    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.Page1();
        wpfAddressCtrl.InitializeComponent();
        ctrlHost.Child = wpfAddressCtrl;

        wpfAddressCtrl.OnButtonClick += 
            new MyControls.Page1.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 屬性 (Property) 設為 DockStyle.Fill

  3. ElementHost 控制項加入至 Panel 控制項的 Controls 集合。

  4. 建立 WPF 頁面的執行個體 (Instance)。

  5. 將頁面指派給 ElementHost 控制項的 Child 屬性,以將頁面裝載在表單上。

Form1_Load 方法中的其餘兩行會將處理常式附加至兩個頁面事件:

  • OnButtonClick 是在使用者按一下 [確定] 或 [取消] 按鈕時,頁面所引發的自訂事件。處理這個事件可以取得使用者的回應,以及收集使用者填寫的任何資料。

  • Loaded 是 WPF 頁面在完全載入時所引發的標準事件。因為範例需要使用頁面的屬性來初始化數個全域變數,所以在這裡使用這個事件。發生表單的 Load 事件時,並未完全載入頁面,而且那些值仍然設為 null。您必須等到頁面的 Loaded 事件發生,才能存取那些屬性。

Loaded 事件處理常式已顯示在前一個程式碼範例中。OnButtonClick 處理常式則會在下一節中進行討論。

處理 OnButtonClick

當使用者按一下 [確定] 或 [取消] 按鈕時,就會發生 OnButtonClick 事件。

事件處理常式會檢查事件引數的 IsOK 欄位,判斷按下的是哪個按鈕。lbldata 變數對應於先前討論過的不可見的 Label 控制項。如果使用者按的是 [確定] 按鈕,則會將頁面之 TextBox 控制項的資料指派給對應的 Label 控制項。如果使用者按的是 [取消],則會將 Text 值設為 null。

請將下列程式碼加入至 Form1.cs。您現在可以編譯並執行應用程式了。

void avAddressCtrl_OnButtonClick(
    object sender, 
    MyControls.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: ";
    }
}

修改 Windows Presentation Foundation 頁面的外觀

表單左邊的 RadioButton 控制項可讓使用者變更 WPF 頁面的前景和背景色彩,以及數個字型屬性。背景色彩是透過 ElementHost 物件公開。其餘屬性則是公開為頁面的自訂屬性。

按兩下表單上的 RadioButton 控制項,建立對應 CheckedChanged 事件處理常式的範本。請從下列處理常式中擷取程式碼,然後將它加入至 Form1.cs 中對應的處理常式。

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 FontFamily("Times New Roman");
}

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new 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;
}

請參閱

工作

逐步解說:在 Windows Form 中裝載 Windows Presentation Foundation 複合控制項

概念

逐步解說:在 Windows Presentation Foundation 中裝載 Windows Form 複合控制項

參考

ElementHost

WindowsFormsHost

其他資源

WPF 設計工具