WPF是win form的下一代版本,现在越来越多的公司使用WPF。如何兼容已有的使用win form开发的应用程序呢?下面有三种方式来在WPF中调用win form。

使用WPF中的WindowsFormsHost控件来承载win form的控件或者控件库。

WindowsFormsHost是在WindowsFormsIntegration程序集中,位于System.Windows.Forms.Integration命名空间下面。此控件能够承载的是win form的单一控件或者复合控件,但是不能使用top-level的Form,否则会出现错误。

<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:winform="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="WPF Invoke winform">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="this is only a test of wpf invoking win form"/>
<WindowsFormsHost Grid.Row="1" x:Name="wfh">
<winform:Button Text="I am from win form" Click="Button_Click_1"/>
</WindowsFormsHost>
</Grid>
</Window>

  

使用WPF中的WindowsInteropHelper来定位和调用win form窗体。

WindowsInteropHelper是在PresentationFramework程序集中,位于System.Windows.Interop命名空间下面。它能够拿到WPF的窗体,并且通过IWin32Window来作为win form的载体。主要代码如下:

public class WindowWapper : System.Windows.Forms.IWin32Window
{
private IntPtr _handle; public IntPtr Handle
{
get
{
return this._handle;
}
} public WindowWapper(IntPtr handle)
{
this._handle = handle;
}
}
 private void FirstWayToInvoke()
{
var form = WinformExample.Program.CreatInstance();
WindowInteropHelper helper = new WindowInteropHelper(this);
form.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
form.Show(new WindowWapper(helper.Handle));
}

使用Process来直接启动已经存在的win form应用程序。

主要是使用Process.Start()方法来启动一个进程,即win form应用程序。

private static void SecondWayToInvoke(string winformExePath)
{
Process.Start(winformExePath);
}

具体例子:http://files.cnblogs.com/files/allanli/WpfTest.zip

WPF调用Win Form的更多相关文章

  1. WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )

    WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...

  2. Win Form程序线程点点

    消息循环 Win32窗体程序基于消息驱动的,程序的模型就是一个用户触发事件消息->系统分发事件消息->程序处理事件的循环过程. .NET Win Form程序对消息循环进行了封装,可以看到 ...

  3. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  4. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变

    本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...

  5. WPF调用图片路径,或资源图片

    一.加载本项目的图片WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源.其中较为常见的情况是用Uri加载图像.Uri表达式的一般形式为:协议+授权 ...

  6. C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成软件

    C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成 1,调用ffmpeg将外挂字幕“嵌入”视频中,保存副本: 2,调用ffmpeg将副本视频导出为gif图片. 参考资料 ...

  7. WPF 调用资源图片

    原文:WPF 调用资源图片 最近做的wpf项目中,在开发的时候,把图片放到了bin下面,采用了imagePath =System.IO.Directory.GetCurrentDirectory()+ ...

  8. WPF 调用API修改窗体风格实现真正的无边框窗体

    原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...

  9. WPF调用C++生成的dll文件(示例)

    注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...

随机推荐

  1. java多线程系列:Semaphore和Exchanger

    本篇文章将介绍Semaphore和Exchanger这两个并发工具类. Semaphore 信号量(英语:Semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值.当 ...

  2. python 全局搜索路径

    在~/.bachrc中添加 export PYTHONPATH=$PATHONPATH:[需要添加的路径]

  3. python logging日志库

    项目中使用的日志库是使用python官方库logging封装的,但是居然一直么有设置日志自动滚动,经常会受到告警说哪台机器磁盘空间又满,清理一下,于是研究一下,解决这个问题. 参考:https://d ...

  4. ACM 离散化处理

    使用STL算法离散化: 思路:先排序,再删除重复元素,然后就是索引元素离散化后对应的值. 1.  unique():   头文件为algorithm unique的作用是“去掉”容器中相邻元素的重复元 ...

  5. winform 动态添加控件及事件

    for (int i = 0; i < 4; i++) { Button btn = new Button(); //btn.Name = dt.Rows[i]["ANDON_CONT ...

  6. web安全问题-csrf

    web安全问题 csrf <script> document.write(` <form name="commentForm" target="csrf ...

  7. Jmeter解决乱码问题

    一.设置编码方式utf-8并勾选编码 适用场景:参数中含有中文或乱码 二.增加beanshell脚本 添加BeanShell PostProcessor或者BeanShell Sampler,输入代码 ...

  8. ABAP开发常见任务

    在ABAP开发中 最主要的工作: 1 报表的开发 主要使用到数据库读取 ALV LIST等技术: 2 单据的打印 主要使用到数据库读取.SmartFirms.Form等技术: 3 数据的上载 主要使用 ...

  9. 33 个 2017 年必须了解的 iOS/swift 开源库第三方库

    本文翻译自Medium,原作者为 Paweł Białecki&lt;img src="https://pic3.zhimg.com/v2-c786777447261347b0d97 ...

  10. php 顺序线性表

    <?php /* * 线性顺序表 ,其是按照顺序在内存进行存储,出起始和结尾以外都是一一连接的(一般都是用一维数组的形式表现) * * GetElem: 返回线性表中第$index个数据元素 * ...