Windows Form 主應用程式使用 ElementHost 物件來裝載表單上的 WPF 頁面。應用程式會處理頁面的 OnButtonClick 事件,以接收來自表單的資料。應用程式也會有一組可用來修改頁面外觀的選項按鈕。下列螢幕擷取畫面顯示所呈現的表單。
裝載在 Windows Forms 應用程式中的 Windows Presentation Foundation 頁面
.png)
建立專案
若要啟動此專案:
啟動 Visual Studio,並開啟 [新增專案] 對話方塊。
選取具有 [Windows Forms 應用程式] 範本的 [C# 專案]。
將新專案命名為 WFHost,並將它放在內含 MyControls 專案的相同最上層資料夾中。按一下 [確定],建立專案。
您也需要加入內含 WPF 頁面之 DLL 的參考:
按一下 [方案總管] 中的專案名稱,然後選取 [加入參考]。
按一下 [瀏覽] 索引標籤,然後巡覽至內含 MyControls.dll 的資料夾。
選取 MyControls.dll,然後按一下 [確定] 將 DLL 加入至參考清單。
在 [方案總管中],加入名為 WindowsFormsIntegration.dll 之 WindowsFormsIntegration 組件 (Assembly) 的參考。
實作表單的使用者介面設計
初始化表單
一般實作的是表單之 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 控制項的一般程序:
建立新的 ElementHost 物件。
將控制項的 Dock 屬性 (Property) 設為 DockStyle..::.Fill。
將 ElementHost 控制項加入至 Panel 控制項的 Controls 集合。
建立 WPF 頁面的執行個體 (Instance)。
將頁面指派給 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;
}