zoukankan      html  css  js  c++  java
  • 转载 [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary

    [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary

    在[WPF][C#]在WPF中内嵌WindowsForm控件一文中为各位介绍了直接在WPF中使用XAML来嵌入Windows Form控件的作法,不过不是每个人都喜欢写XAML,而且有时候会需要把已经存在的Windows Form应用程序嵌入到WPF中,所以这次就来跟大家介绍怎么使用参考dll档的方式,把dll中的Windows Form加到WPF中。

    都说了要使用WindowsFormsControlLibrary了,所以我们就直接建立一个WindowsFormsControlLibrary项目吧!!接着我在该项目中新增两个Windows Form,分别为Form1和Form2,然后随便放一些控件在上面,然后建置项目。

    接着在方案中加入另一个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的画面会像下图)。

    引用了之后,我们就可以在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里头,接着来看看执行的结果吧!!

    咦!!!!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档,就可以依照上面的方式玩弄它了!

  • 相关阅读:
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    centos安装swoole
    Apache优化:修改最大并发连接数
    centos中安装、升级git
    memcached/memcache安装
  • 原文地址:https://www.cnblogs.com/mybabyyh/p/4204436.html
Copyright © 2011-2022 走看看