问题1: 

WPF中在使用WindowsFormsHost调用WinFrom控件时,若在WindowsFormsHost上层添加了WPF控件,该控件不会显示出来。

 <Grid>
<WindowsFormsHost Background="White">
<Winfrm:WebBrowser x:Name="WinFrmWebBrowser"/>
</WindowsFormsHost>
<!--运行时 Ellipse 不会显示出来-->
<Ellipse Width="100" Height="100" Fill="Red"/>
</Grid>

解决方案: 使用Popup对上层的WPF控件内容进行包装。

<Style TargetType="{x:Type local:MyBrowser}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyBrowser}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Border x:Name="Part_BdrWinfrmHostContainer">
<WindowsFormsHost x:Name="Part_WinfrmHost" Background="Gray">
<Winfrm:WebBrowser x:Name="Part_WinFrmWebBrowser"/>
</WindowsFormsHost>
</Border>
<Popup x:Name="PART_Popup" IsOpen="True" Placement="Center"
AllowsTransparency="True">
<!--所有WPF内容添加至这个Border里面-->
<Border x:Name="PART_Content"/>
</Popup>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

我测试时封装成了自定义的CustomControl。 对应的.cs文件中定义了Link、 Content两个依赖属性接收参数。

<Grid x:Name="GdPopupWays" Grid.Column="1">
<local:MyBrowser Link="http://www.baidu.com">
<local:MyBrowser.Content>
<!--local:OverLayer是自定义的UserControl-->
<local:OverLayer/>
</local:MyBrowser.Content>
</local:MyBrowser>
</Grid>

如右侧,我创建了一个黄色的Ellipse叠加在WindowsFormHost 上面成功呈现出来。(tips:我在WindowsFormHost 里面加载了WinForm的WebBrowser)。

问题2:

想要将加载在WindowsFormHost中的内容进行裁剪。

解决方案:WinForm控件的Region属性限制显示区域。 相当于WPF的Clip。 示例如下:

GraphicsPath path = new GraphicsPath() { FillMode = FillMode.Winding };
path.StartFigure();
path.AddEllipse(new System.Drawing.Rectangle(, , (int), (int)));
path.AddRectangle(new System.Drawing.Rectangle(, , , ));
path.CloseFigure();
this.WinformRtx.Region = new Region(path);

我的测试效果,WPF中用Image加载了一张星空图,右上角放置了WindowsFormHost内容。我对其进行了显示区域限制。

3:问题三

两个WindowsFormHost叠加时,WindowsFormHost对于png的背景图不支持透明。如下图:

<Grid x:Name="GdMain">
<Image x:Name="ImgSky" Source="Sky.jpg" Stretch="Fill"/> <!--加载Winform的WebBrowser-->
<WindowsFormsHost Background="White">
<Winfrm:WebBrowser x:Name="WinFrmWebBrowser"/>
</WindowsFormsHost> <WindowsFormsHost Width="" Height="" HorizontalAlignment="Right"
x:Name="WinfrmHostOverlayer" VerticalAlignment="Top"
Background="Transparent">
<Winfrm:Panel x:Name="WinfrmPanel"/>
</WindowsFormsHost>
</Grid>

可以看到右上角的png边框分明(实时上我放的是一张三个角均为透明的圆形png)。 若对右上角的Winform Panel进行裁剪。

裁剪完后,下面一层的WindowsFormHost也被裁了,露出了我用Image加载的星空底图,如下图:

解决方案:将要加载的Winform控件放在一起,可以是在同一个Winform Panel下面,这时在进行裁剪就不会有问题。

<Grid x:Name="GdMain">
<Image x:Name="ImgSky" Source="Sky.jpg" Stretch="Fill"/>
<WindowsFormsHost HorizontalAlignment="Right"
x:Name="WinfrmHostOverlayer" VerticalAlignment="Top"
Background="Transparent">
<Winfrm:Panel x:Name="WinfrmPanel">
<!--<Winfrm:WebBrowser x:Name="WinFrmWebBrowser"/>-->
<!--<Winfrm:Panel x:Name="WinFrmSubPanel"/>-->
</Winfrm:Panel>
</WindowsFormsHost>
</Grid>

上文中WebBrowser我都加载的是www.baidu.com.  为了凸显效果,下图所示Demo加载的是腾讯企业邮箱主页。

源代码下载链接:微信扫描下方二维码文章末尾获取链接。

WPF应用中对WindowsFormHost内容进行裁剪的更多相关文章

  1. WPF TextSelection获取选中部分内容

    一.简单实例 //TextSelect继承自TextRange TextSelection selection = richTextBox.Selection; //1.获取选中内容 string r ...

  2. 如何在WPF程序中使用ArcGIS Engine的控件

    原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...

  3. WPF/Silverlight中的RichTextBox总结

    WPF/Silverlight中的RichTextBox总结   在WPF或者是在Silverlight中有个非常强大的可以编辑的容器控件RichTextBox,有的时间会采取该控件来作为编辑控件.鉴 ...

  4. WPF程序中App.Config文件的读与写

    WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...

  5. WPF拖动DataGrid滚动条时内容混乱的解决方法

    WPF拖动DataGrid滚动条时内容混乱的解决方法 在WPF中,如果DataGrid里使用了模板列,当拖动滚动条时,往往会出现列表内容显示混乱的情况.解决方法就是在Binding的时候给Update ...

  6. C# WPF DataGrid 隔行变色及内容居中对齐

    C# WPF DataGrid 隔行变色及内容居中对齐. dqzww NET学习0     先看效果: 前台XAML代码: <!--引入样式文件--> <Window.Resourc ...

  7. 浅谈WPF本质中的数据和行为

    WPF缩写为Windows Presentation Foundation的缩写,本文所要谈的就是WPF本质中的数据和行为,希望通过本文能对大家了解WPF本质有所帮助. 如果自己来做一个UI框架,我们 ...

  8. Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作

    Oracle 远程访问配置   服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...

  9. 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi

    优雅的在WinForm/WPF/控制台 中使用特性封装WebApi 说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpL ...

随机推荐

  1. Python网络爬虫——BeautifulSoup4库的使用

    使用requests库获取html页面并将其转换成字符串之后,需要进一步解析html页面格式,提取有用信息. BeautifulSoup4库,也被成为bs4库(后皆采用简写)用于解析和处理html和x ...

  2. 《Windows内核安全与驱动开发》4.1 文件操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...

  3. Python中的Tcp协议的应用之Tcp服务端程序开发

    TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...

  4. CentOS下永久修改主机名

    永久修改主机名 [root@centos7 ~]# vim /etc/hostname 打开之后将原来的名字改成你想换的名字 [root@centos7 ~]# cat /etc/hostname 查 ...

  5. luogu P2812 校园网络【[USACO]Network of Schools加强版】|Tarjan

    题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...

  6. 简单高效的端口扫描python脚本

    欢迎python爱好者加入:学习交流群 667279387 最近为了获取虚拟机端口开放情况,写了一个简单脚本来查看.共享给大家.下面的代码在python2种测试通过 说明:concurrent是pyt ...

  7. Spring简介即Spring Ioc

    Spring框架简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE De ...

  8. CodeForces1006E- Military Problem

    E. Military Problem time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  9. 用Python写一个游戏脚本,你会吗?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:ivat4u  学习python有一段时间了,由于python语言的强大 ...

  10. JAVA可视化闹钟源码

    概述 一些同学的Java课设有这样一个问题,比较感兴趣就做了一下 功能介绍: 1.可增加闹钟 2.可删除闹钟 3.时间到了响铃 4.关闭闹钟不会丢失闹钟(因为闹钟存储在txt文件中,不会因程序关闭就终 ...