[WPF][C#] 在WPF中內嵌WindowsForm控制項 - 使用WindowsFormsControlLibrary

  • 13441
  • 0
  • C#
  • 2013-07-14

在[WPF][C#]在WPF中內嵌WindowsForm控制項一文中為各位介紹了直接在WPF中使用XAML來嵌入Windows Form控制項的作法,不過不是每個人都喜歡寫XAML,而且有時候會需要把已經存在的Windows Form應用程式嵌入到WPF中,所以這次就來跟大家介紹怎麼使用參考dll檔的方式,把dll中的Windows Form加到WPF中。

 

[WPF][C#]在WPF中內嵌WindowsForm控制項一文中為各位介紹了直接在WPF中使用XAML來嵌入Windows Form控制項的作法,不過不是每個人都喜歡寫XAML,而且有時候會需要把已經存在的Windows Form應用程式嵌入到WPF中,所以這次就來跟大家介紹怎麼使用參考dll檔的方式,把dll中的Windows Form加到WPF中。

都說了要使用WindowsFormsControlLibrary了,所以我們就直接建立一個WindowsFormsControlLibrary專案吧!!接著我在該專案中新增兩個Windows Form,分別為Form1和Form2,然後隨便放一些控制項在上面,然後建置專案。

image image

 

接著在方案中加入另一個WPF應用程式當作Host,這邊我就直接拿[WPF][C#]在WPF中內嵌WindowsForm控制項一文中的專案來修改,把MainWindow.xaml的內容改為如下:

MainWindow.xaml
<Window x:Class="WPF_Winform.MainWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:WinFormHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
             xmlns:WinFormControls="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
             mc:Ignorable="d" 
             Title="MainWindow" 
             d:DesignWidth="800" d:DesignHeight="600"
	     Width="Auto" Height="Auto">
    <Grid Name="LayoutRoot"  Background="Gray">
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <WindowsFormsHost Name="windowsFormsHost1" Grid.Column="0" Margin="3"></WindowsFormsHost>
        <WindowsFormsHost Name="windowsFormsHost2" Grid.Column="1" Margin="3"></WindowsFormsHost>
    </Grid>
</Window>

 

接著我們要在WPF專案中引用剛才WindowsFormsControlLibrary專案建出來的dll檔(因為我有安裝Productivity Power Tools這個Extension,所以Add Reference的畫面會像下圖)。

image image

 

引用了之後,我們就可以在WPF專案中玩弄WindowsFormsControlLibrary中的Windows Form控制項了,這邊就示範用C#把Form1和Form2加到WPF的MainWindow中:

MainWindow.xaml.cs
using System.Windows;
using WindowsFormsControlLibrary;
using System.Windows.Forms;

namespace WPF_Winform
{
    public partial class MainWindow : Window
    {
        private Form1 _form1 = new Form1();

        private Form2 _form2 = new Form2();

        public MainWindow()
        {
            InitializeComponent();

            _form1.TopLevel = false;

            windowsFormsHost1.Child = _form1;

            Panel panelCenter = new Panel { BackColor = System.Drawing.Color.Blue };

            panelCenter.Dock = DockStyle.Fill;

            _form1.Controls.Add( panelCenter );

            Panel panelTop = new Panel { BackColor = System.Drawing.Color.White , MinimumSize = new System.Drawing.Size { Height = 100 , Width = 0 } };

            panelTop.Dock = DockStyle.Top;

            panelCenter.Controls.Add( panelTop );

            _form2.TopLevel = false;

            windowsFormsHost2.Child = _form2;
        }
    }
}

 

仔細看看上面的程式碼,我還加了另外兩個Panel控制項到Form1裡頭,接著來看看執行的結果吧!!

image

 

咦!!!!Form1的兩個Panel明明就是後來才加進去的,怎麼會被原來的兩個Label蓋住了呢??因為Windows Form中物件的Z-Index和加入的先後順序與WPF是相反的(這個很重要喔!!如果要玩WPF+Windows Form的話千萬別忽略這點~)

Windows Form中先加入的控制項會疊在越上面,WPF則是越後面加的會疊在越上面。其實我在Form2裡面也放了兩個Label,只是因為是在加入兩個Panel之後才加入的,所以會被兩個Panel蓋住而看不到。

 

如果去看看Form2.Designer.cs檔的內容的話,就會發現裡面有一段是這樣的:

Form2.Designer.cs
this.Controls.Add( this.panel2 );
this.Controls.Add( this.panel1 );
this.Controls.Add( this.label2 );
this.Controls.Add( this.label1 );

 

不只是在C#中加入物件是這樣,就連在XAML中直接加入Windows Form控制項也是一樣喔,先加的會在上層!!(有需要的朋友可以下載[WPF][C#]在WPF中內嵌WindowsForm控制項的專案原始檔回去玩看看)

 

同場加映:

 

如果要內嵌進WPF的是現成的Windows Form Application的話怎麼辦呢?很簡單,只要在把專案的Output Type改為Class Library之後重新Build,引用它產出的dll檔,就可以依照上面的方式玩弄它了!

image image

 

今天就跟大家分享到這邊啦~最後一樣奉上專案原始檔,請自行服用~