按一下以給予評分及指教
MSDN
MSDN Library
.NET 開發
.NET Framework
 逐步解說:在 Windows Form 中裝載 Windows Pre...

  開啟低頻寬檢視
本頁僅適用於
Microsoft Visual Studio 2008/.NET Framework 3.5

其他版本也適用於下列軟體:
Windows Presentation Foundation
逐步解說:在 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.

這個範例中使用的 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 中的程式碼。

C#
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://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 項目的下面。

C#
<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 項目則使用預設樣式。

C#
<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 部分現在已完成。

C#
<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 所組成,而這個命名空間包含 Page1MyControlEventArgs 這兩個類別。請用下列程式碼取代 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 項目 nameLabelName,來存取該項目的屬性設定。

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

C#
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。而這兩個按鈕的名稱為 btnOKbtnFalse,讓處理常式只要檢查 sender 引數的值就可以判斷按的是哪一個按鈕。處理常式會執行下列動作:

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

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

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

將下列程式碼加入至 Page1 類別,就放在 Init 方法的下面。

C#
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 類別。

C#
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 命名空間。這項實作十分簡單,因此不再進一步討論。

C#
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 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 中的程式碼。

C#
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。您現在可以編譯並執行應用程式了。

C#
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 中對應的處理常式。

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

社群內容   什麼是社群內容?
新增內容 RSS  註解
Processing
© 2009 Microsoft Corporation. 著作權所有,並保留一切權利。 使用規定  |  商標  |  隱私權聲明
Page view tracker