写插件弹窗是肯定要有的,有弹窗才有展示功能的页面啊!

记录一下前段时间遇到的一些弹窗方面的坑,一个个踩过来也是收获颇丰啊!

WPF弹窗

最简单的弹窗方式,new一个窗体,然后调用Show方法。

Window window = new Window();
window.Show();

然后根据需求的不一样,就有一些东西要调整了,简单一些的比如是否在任务栏显示,是否允许最大最小化,是否运行拖拽等等

window.ShowInTaskbar = false;
window.ResizeMode = ResizeMode.NoResize;
window.AllowDrop = false;

像上面那样一顿噼里哗啦操作。确实,弹窗出来了~但是点击起来就有点不对劲了。每次点击或焦点切换到主窗体的时候,弹窗都会被主窗体盖住。

马上想到了有一个解决方法,设置弹窗为最顶层就ok了啊!就不用担心被盖住了。

window.Topmost = true;

果然达到了预期,哪怕焦点切换了,弹窗也还是显示在最上面。emmmm,这么大个问题解决了,偷偷摸个鱼不过分吧!愉快的tab切换摸鱼模式。可是,什么鬼!为啥这个弹窗还跟过来了啊!原来不只是插件页面置顶了,全部软件都置顶啊!

正确解决方法

Window window = new Window();
window.Title = "我是WPF弹窗!!!!";
new System.Windows.Interop.WindowInteropHelper(window) { Owner = new IntPtr(Globals.ThisAddIn.Application.HWND) };
window.Show();

WindowInteropHelper 这个名字看着有点像自己定义的类,其实是微软的一个帮助类,用于协助WPF和Win32代码之间的互相操作。最简单的应用就是在Win32中弹出一个WPF的弹窗。



这时候就可以看到,焦点在主窗口时,弹窗也不会被遮盖,并且最小化主窗口的时候,弹窗也会被收起来,切换到别的软件时,会正常盖住弹窗!

Winform弹窗

Winform的弹窗肯定和WPF的差不多,毕竟也是先有的Winform才有的WPF。一样两句话弹个窗,但是问题也和上面的一样!

Form form = new Form();
form.Show();

细心一点可以发现,在输入Show方法的时候,其实是有一个重载方法的,需要传入一个IWin32Window对象。并且IWin32Window其实是一个接口类,内部只有一个返回句柄的属性。

//owner:任何实现 System.Windows.Forms.IWin32Window 并表示将拥有此窗体的顶级窗口的对象。
public void Show(IWin32Window owner); public interface IWin32Window
{
//获取表示由实现者的窗口句柄。
IntPtr Handle { get; }
}

尝试一下,建一个类继承IWin32Window接口,然后根据主页面的句柄去new一下这个类,并作为参数传入到Show方法里面。

public class WinWrap : IWin32Window
{
private IntPtr m_Handle;
public IntPtr Handle
{
get { return m_Handle; }
}
//构造函数,参数是父窗口的句柄
public WinWrap(int handle)
{
this.m_Handle = new IntPtr(handle);
}
} Form form = new Form();
form.Text = "这是Winform弹窗!!!";
WinWrap owner = new WinWrap(Globals.ThisAddIn.Application.HWND);
form.Show(owner);

Winform弹窗内嵌入WPF控件

由于一些接口只允许传入Winform窗体或控件,所以需要将WPF控件包装一下

var toolControl = new Controls.ToolControl();//WPF控件
var form = new System.Windows.Forms.UserControl();//Winform控件
System.Windows.Forms.Integration.ElementHost elementHost = new System.Windows.Forms.Integration.ElementHost();
elementHost.Child = toolControl;
elementHost.Dock = System.Windows.Forms.DockStyle.Fill;
form.Controls.Add(elementHost);

总结

感叹一下,Winform和WPF真的是一脉相承。。。

VSTO之WPF和Winform弹窗的更多相关文章

  1. WPF与WinForm开发有什么区别?

    转自http://hi.baidu.com/leoliu83/blog/item/1d1a4a66dcb41134aa184cfd.html WPF开发于WinForm之后,从技术发展的角度,WPF比 ...

  2. WPF与Winform的选择

    最近公司计划对ERP系统全面升级,现有的ERP是简单的bs架构系统打算改版成cs.平时如自己写一些工具,小应用都是用winform就足够.但是界面总是很难看,据了解WPF在这一方面会强一些.因为之前对 ...

  3. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

  4. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfr ...

  5. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  6. WPF和Winform中picturebox图片局部放大

    原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...

  7. WPF与WinForm的抉择

    微软曾经对WPF(代号Avalon)抱很大的期望——新一代的华丽用户界面平台,一统Web应用和桌面应用,Flash杀手,尽管微软口头上不承认.几年下来,WPF确实实现了当初的预期的大部分功能,但离称霸 ...

  8. wpf和winform的区别

    深入浅出WPF(7)——数据的绿色通道,Binding(上) 水之真谛关注6人评论28117人阅读2008-06-23 02:40:00  http://liuteimeng.blog.51cto.c ...

  9. WPF 调用WinForm控件

    WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...

随机推荐

  1. Java中的时间二三事

    实习过程中对于时间的处理有很多,有的还涉及到从数据库取出时间,所以做一些总结,想到那先写到哪,慢慢补充.    首先最常见的是java.util中的Date类,这个类封装了当前的日期和时间,它实际是计 ...

  2. Vue系列:Vue Router 路由梳理

    Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数. ...

  3. java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态

    刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...

  4. .netcore持续集成测试篇之Xunit结合netcore内存服务器发送post请求

    系列目录 Web项目中,很多与用户数据交互的请求都是Post请求,想必大家都用过HttpClient构造过post请求,这里并不对HttpClient做详细介绍,只介绍一些常用的功能.并结合AutoF ...

  5. HelloDjango 第 07 篇:创作后台开启,请开始你的表演!

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在此之前我们完成了 django 博客首页视图的编写,我们希望首页展示发布的博客文章列 ...

  6. (二)c#Winform自定义控件-按钮

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. Tomcat 方式部署 Solo 博客系统总结

      此篇为Tomcat部署方式,另有Docker部署方式,请参考文章<Docker 方式部署 Solo 博客系统总结> 一.环境和文件准备 服务器:购买的阿里云服务器,系统为Linux(C ...

  8. Sqlserver 查询分组 记录

    select b.* from (select a.*,row_number() over (partition by 列1 order by 列2 desc) rn from a) b ; --如需 ...

  9. Reactive 漫谈

    目录 概念 面向流设计 异步化 响应式宣言 参考文档 概念 Reactive Programming(响应式编程)已经不是一个新东西了. 关于 Reactive 其实是一个泛化的概念,由于很抽象,一些 ...

  10. ajax方法请求成功后,没有执行success的方法

    $.ajax( { type: "POST", url: "AddSupplier.aspx", dataType:"text", data ...