WPF中去边框窗体与WebBrowser控件的兼容问题解决办法
来源:互联网 发布:网络安全管理考试试题 编辑:程序博客网 时间:2024/06/06 09:29
问题产生原因:若设置窗体为AllowsTransparency="True",WindowStyle="None",内嵌的WebBrowser就无法显示了,但它加载的网页内容还能正常交互。
解决方案:
通过google,找到了如下的WPF窗体文件,并对其进行了简单修改。
1.添加一个新窗体,命名为WebBrowserOverlay;
XAML:WebBrowserOverlay.xaml
<Window x:Class="WpfUI.WebBrowserOverlay" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStyle="None" ShowInTaskbar="False" ResizeMode="NoResize"> <WebBrowser Name="_wb"> </WebBrowser></Window>C#:WebBrowserOverlay.xaml.cs
using System;using System.Diagnostics;using System.Windows;using System.Windows.Controls;using System.Windows.Interop;using System.Windows.Media;namespace WpfUI{ /// <summary> /// Displays a WebBrowser control over a given placement target element in a WPF Window. /// The owner window can be transparent, but not this one, due mixing DirectX and GDI drawing. /// WebBrowserOverlayWF uses WinForms to avoid this limitation. /// </summary> public partial class WebBrowserOverlay : Window { FrameworkElement _placementTarget; public WebBrowser WebBrowser { get { return _wb; } } public WebBrowserOverlay(FrameworkElement placementTarget) { InitializeComponent(); _placementTarget = placementTarget; Window owner = Window.GetWindow(placementTarget); Debug.Assert(owner != null); //owner.SizeChanged += delegate { OnSizeLocationChanged(); }; owner.LocationChanged += delegate { OnSizeLocationChanged(); }; _placementTarget.SizeChanged += delegate { OnSizeLocationChanged(); }; if (owner.IsVisible) { Owner = owner; Show(); } else owner.IsVisibleChanged += delegate { if (owner.IsVisible) { Owner = owner; Show(); } }; //owner.LayoutUpdated += new EventHandler(OnOwnerLayoutUpdated); } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e); if (!e.Cancel) // Delayed call to avoid crash due to Window bug. Dispatcher.BeginInvoke((Action)delegate { Owner.Close(); }); } void OnSizeLocationChanged() { Point offset = _placementTarget.TranslatePoint(new Point(), Owner); Point size = new Point(_placementTarget.ActualWidth, _placementTarget.ActualHeight); HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(Owner); CompositionTarget ct = hwndSource.CompositionTarget; offset = ct.TransformToDevice.Transform(offset); size = ct.TransformToDevice.Transform(size); Win32.POINT screenLocation = new Win32.POINT(offset); Win32.ClientToScreen(hwndSource.Handle, ref screenLocation); Win32.POINT screenSize = new Win32.POINT(size); Win32.MoveWindow(((HwndSource)HwndSource.FromVisual(this)).Handle, screenLocation.X, screenLocation.Y, screenSize.X, screenSize.Y, true); } }}
2.在主窗体中加入一个关闭按钮和一个命名为BdBrowser的Border元素,再在BdBrowser中添加一个WebBrowser控件;
<Grid Background="#FF009D99"><Button x:Name="BtnClose" Content="×" Margin="0" Width="30" Height="30" HorizontalAlignment="Right" VerticalAlignment="Top" FontWeight="Bold" FontSize="16" Foreground="#FFCC0000" FontFamily="Arial Black" Focusable="False" Click="BtnClose_Click"></Button><Border x:Name="BdBrowser" Margin="0,30,0,0"><WebBrowser x:Name="WbBrowser"/></Border></Grid>
3.加载调用。
var w = new WpfUI.WebBrowserOverlay(BdBrowser); var wb = w.WebBrowser; wb.Navigate(new System.Uri("http://www.baidu.com/"));
由于WPF中的WebBrowser功能远没有WinForm中的强大,所以我尝试着在WPF中嵌入WinForm的WebBrowser,方案如下(只贴了修改部分的代码,其他同上):
1.添加引用System.Windows.Forms和WindowsFormsIntegration;
2.在WebBrowserOverlay.xaml中嵌入WindowsFormsHost以承载WinForm的WebBrowser控件;
<Window x:Class="WpfUI.WebBrowserOverlay" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:wf ="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" WindowStyle="None" ShowInTaskbar="False" ResizeMode="NoResize"> <wfi:WindowsFormsHost x:Name="_wfh"> <wf:WebBrowser x:Name="_wb"/> </wfi:WindowsFormsHost></Window>
3.WebBrowserOverlay.xaml.cs中将System.Windows.Controls.WebBrowser替换成System.Windows.Forms.WebBrowser;
public System.Windows.Forms.WebBrowser WebBrowser { get { return _wb; } }
4.主窗体不做改变,但是我稍微改动了一下,以便后续开发。加了一个TextBox作为地址栏,一个Button作为跳转按钮,功能简略,各位看官可以跳过。
using System.Windows;namespace WpfUI{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary> public partial class MainWindow : Window { private WebBrowserOverlay wbo; private System.Windows.Forms.WebBrowser fwb; public MainWindow() { this.InitializeComponent(); // 在此点下面插入创建对象所需的代码。 wbo = new WebBrowserOverlay(BdBrowser); fwb = wbo.WebBrowser; fwb.Navigate(new System.Uri(TbAddress.Text)); } private void BtnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } private void BtnGo_Click(object sender, RoutedEventArgs e) { string add = TbAddress.Text; fwb.Navigate(new System.Uri(add)); } }}
源码资源下载:http://download.csdn.net/detail/danding_ge/7167399
1 0
- WPF中去边框窗体与WebBrowser控件的兼容问题解决办法
- DELPHI 中让嵌入窗体的 WebBrowser 控件无边框
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
- WPF中webBrowser控件与js的交互
- 今日问题汇总-WPF中更改Image控件的source、WPF 去掉窗体边框
- 让嵌入窗体的 WebBrowser 控件无边框(转)
- 让嵌入窗体的 WebBrowser 控件无边框
- 让嵌入窗体的 WebBrowser 控件无边框 vc/mfc
- wpf中无边框窗体的问题
- 去WebBrowser控件的3d边框,示例代码段
- WPF 去边框 自定义窗体 拖动窗体大小变化
- WPF调用winform(基于GDI)的控件和WPF窗体无边框的处理
- WPF中使用WebBrowser控件的刷新问题[已解决]
- VB6 Webbrowser控件中新窗体对应的拦截
- WPF中制作无边框窗体
- 第三方程序调用Android Telephony 接口机制
- C++中获取WinNT/Win2k当前用户名和密码
- 阿里面试(一)
- C++基础:怎样判断某一文件是否存在
- 在线编译还不成熟
- WPF中去边框窗体与WebBrowser控件的兼容问题解决办法
- TortoiseGit加msysGit在Git@OSC实现代码托管
- 蓄水池抽样——《编程珠玑》读书笔记
- 你们是有神论吗?
- 查询被锁的对象及解决方法
- 黑马程序员 java IO FileReader FileWriter 文件操作
- 解决MyEclipse10.7 部署Web Project 失败的问题
- Linux下用C语言将一个字符串格式(char*)的MAC地址转换为十六进制数组
- 操作系统--I/O设备