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

时间: 2024-10-04 04:08:53

转载 [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary的相关文章

在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary

原来有一个WINFORM项目的功能模块希望集成到新的WPF项目中,怎样集成才最简单? 思路:将原来的WINFORM项目类型改为WindowsFormsControlLibrary类型就OK了. 步骤: 1.所以我们就直接建立一个WindowsFormsControlLibrary项目吧!接着我在该项目中新增Windows Form,为Form1.也就是将原来的项目类型改造为WindowsFormsControlLibrary项目. 2新建Wpf项目 (1).添加两个引用:WindowsForms

swt java 内嵌ActiveX控件

这里用的是SWT/JFace开发application中SWT自带的org.eclipse.swt.ole.win32 包可以支持内嵌OLE和ActiveX. 具体用法如下: //创建一个OleFrame做为OLE(或ActiveX)的框架 OleFrame oleFrame = new OleFrame(this, SWT.NONE); //创建ActiveX的容器,其中的classID是ActiveX的classid,在注册表中可以找到 OleControlSite oleControl =

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句和事物处理语句

在PL/SQL中可以使用的SQL语句主要有以下几类: SELECT 查询语句,DML语句,Transaction 事物处理语句,本文将对这几类语句在PL/SQL中的用法逐一介绍. 一.查询语句-SELECT SELECT 语句用来查询一条或多条语句.虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出. 在PL/SQL中使用SELECT 语句的格式如下:   SELECT select_list INTO {variable_name[,variable_name]...

【转】WebResource实现在自定义控件中内嵌JS文件

在类库中的资源  其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发WebControl的编程模型,于是我们摆脱了asp里面的include模式的复用方式.不过1.0/1.1提供的Web控件开发模型对于处理没有image.css等外部资源的组件还算比较得心应手,script虽然很多时候也是外部资源,但在开发控件的时候我们习惯把script使用Page.Registe

MFC 在父对话框中内嵌子对话框

MFC 在父对话框中内嵌子对话框 分类: MFC2012-10-10 21:46 2222人阅读 评论(4) 收藏 举报 mfcborder 原文地址:http://blog.csdn.net/leesaiya/article/details/7374537 [cpp] view plaincopy 一.对话框中显示对话框的方法: 1.首先创建要在对话框里显示的那个对话框,命名为:IDD_INNER. 设置这个对话框的属性: 1).“Style”选择“Child”:中文版“样式”选择“下层”.

WinForm中内嵌WebBroswer

本文系原创. 前两天在工作中需要在Winform的窗体中内嵌的一个浏览器,我们都知道winform其实是自带了WebBroswer控件的,但是这个控件是IE的浏览器,存在这样那样的兼容性问题,不能完全满足的需求,所以就研究了下其他的开源浏览器框架,内嵌到我们的窗体中,完成了产品需求,以下做一个记录和分享. 由于产品是要做商用的,所以必须得考虑开源性和开源协议的问题.研究了Geckofx.CefSharp这两个组件,其中Geckofx的开源许可证为MPL,CefSharp开源许可证为BSD. Ce

WPF系列之二:解耦View层控件事件与ViewModel层事件的响应

以前的做法: 1.当项目的时间比较紧迫的时候,对UI层中控件的事件的处理,往往采取的是类似Winform中最简单的做法,直接做一个事件的Handler直接去调用VM层的方法. 2.控件只有一个Command属性,其它的事件的处理方法没有办法和ViewModel层进行解耦的时候往往也采取上面提到的方法. 如下图所示: 新的做法: 为了实现事件的处理与View层的解耦,我们可以利用WPF提供的附加属性来为需要的事件添加附加行为.附加属性扮演了一个在View层与Model层牵线的角色. 需要下面三个步

WPF编程,通过Double Animation动态更改控件属性的一种方法。

原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87251422 DoubleAnimation类指定起始值(From="30").终点值(To="300").时间(Duration="3"),以及动画结束应该如何(FillBehavior="Stop&qu