- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个为所有窗口和对话框创建自定义外观的应用程序;每个窗口的右上角都有一个定制的“X”按钮,等等。我基本上设置了 WindowStyle=None 和 AllowsTransparency=True。我在此窗口中有一个选项卡控件,其中一个选项卡有一个 WPF WebBrowser 控件。当我刚开始时,我没有在窗口上自定义皮肤,并且 Web 浏览器控件按预期工作。一旦我为窗口设置了皮肤并设置了 AllowsTransparency=True,WebBrowser 控件现在只显示一个空白页面。
我知道 ActiveX 中存在某种缺陷导致了这种情况,因为 WebBrowser WPF 控件本质上是一个包装器。有人可以为这个问题提供一个体面的解决方案或一个体面的解决方法吗?
以下是我的xaml和截图。为了这篇文章,我将它简化为一个简单的窗口:
这有效:(AllowTransparency=False)
<Window x:Class="AllowTransparencyIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="500"
Width="700"
AllowsTransparency="False"
WindowStartupLocation="CenterScreen"
WindowStyle="SingleBorderWindow"
>
<Border BorderBrush="Blue" BorderThickness="3">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" HorizontalAlignment="Right" Click="Button_Click">Close Window</Button>
<TabControl Grid.Row="1">
<TabItem Header="StartPage.com">
<TabItem.Content>
<WebBrowser Source="http://www.startpage.com" />
</TabItem.Content>
</TabItem>
<TabItem Header="Google.com">
<TabItem.Content>
<WebBrowser Source="http://www.google.com" />
</TabItem.Content>
</TabItem>
<TabItem Header="Bing.com">
<TabItem.Content>
<WebBrowser Source="http://www.google.com" />
</TabItem.Content>
</TabItem>
</TabControl>
</Grid>
</Border>
</Window>
截图:
以下代码设置 AllowsTransparency=True 和 WindowStyle=None:
<Window x:Class="AllowTransparencyIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="500"
Width="700"
AllowsTransparency="True"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
>
<Border BorderBrush="Blue" BorderThickness="3">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" HorizontalAlignment="Right" Click="Button_Click">Close Window</Button>
<TabControl Grid.Row="1">
<TabItem Header="StartPage.com">
<TabItem.Content>
<WebBrowser Source="http://www.startpage.com" />
</TabItem.Content>
</TabItem>
<TabItem Header="Google.com">
<TabItem.Content>
<WebBrowser Source="http://www.google.com" />
</TabItem.Content>
</TabItem>
<TabItem Header="Bing.com">
<TabItem.Content>
<WebBrowser Source="http://www.google.com" />
</TabItem.Content>
</TabItem>
</TabControl>
</Grid>
</Border>
</Window>
截图:
最佳答案
我在整个网络上发现了一篇似乎被冗余复制和粘贴的帖子。该帖子帮助我解决了我的问题,但我决定对其进行改进并将其包装得更干净一些。此外,当我在 TabControl 中使用它时,帖子中的原始代码不起作用。
这是我找到的原始帖子的链接:
上述解决方案要求在 WindowsFormsHost 对象中创建一个承载 Windows 窗体 WebBrowser 控件的窗口,该对象实际上会将自身覆盖在边框控件之上。
这是我对解决方案的改进:
WebBrowserOverlayWindow.xaml:
<Window x:Class="AllowTransparencyIssue.WebBrowserOverlayWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WebBrowserOverlayWindow"
xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
WindowStyle="None"
ShowInTaskbar="False"
ResizeMode="NoResize">
<WindowsFormsHost x:Name="wfh">
<winForms:WebBrowser x:Name="wfBrowser" />
</WindowsFormsHost>
</Window>
WebBrowserOverlayWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace AllowTransparencyIssue
{
/// <summary>
/// Interaction logic for WebBrowserOverlayWindow.xaml
/// </summary>
public partial class WebBrowserOverlayWindow : Window
{
public WebBrowserOverlayWindow()
{
InitializeComponent();
}
public static readonly DependencyProperty TargetElementProperty = DependencyProperty.Register("TargetElement", typeof(FrameworkElement), typeof(WebBrowserOverlayWindow), new PropertyMetadata(TargetElementPropertyChanged));
public FrameworkElement TargetElement
{
get
{
return GetValue(TargetElementProperty) as FrameworkElement;
}
set
{
SetValue(TargetElementProperty, value);
}
}
public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(string), typeof(WebBrowserOverlayWindow), new PropertyMetadata(SourcePropertyChanged));
public string Source
{
get
{
return GetValue(SourceProperty) as string;
}
set
{
SetValue(SourceProperty, value);
}
}
private static void SourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
var webBrowserOverlayWindow = sender as WebBrowserOverlayWindow;
if (webBrowserOverlayWindow != null)
{
webBrowserOverlayWindow.wfBrowser.Navigate(args.NewValue as string);
}
}
private static void TargetElementPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
var oldTargetElement = args.OldValue as FrameworkElement;
var webBrowserOverlayWindow = sender as WebBrowserOverlayWindow;
var mainWindow = Window.GetWindow(webBrowserOverlayWindow.TargetElement);
if (webBrowserOverlayWindow != null && mainWindow != null)
{
webBrowserOverlayWindow.Owner = mainWindow;
webBrowserOverlayWindow.Owner.LocationChanged += webBrowserOverlayWindow.PositionAndResize;
webBrowserOverlayWindow.TargetElement.LayoutUpdated += webBrowserOverlayWindow.PositionAndResize;
if (oldTargetElement != null)
oldTargetElement.LayoutUpdated -= webBrowserOverlayWindow.PositionAndResize;
webBrowserOverlayWindow.PositionAndResize(sender, new EventArgs());
if (webBrowserOverlayWindow.TargetElement.IsVisible && webBrowserOverlayWindow.Owner.IsVisible)
{
webBrowserOverlayWindow.Show();
}
webBrowserOverlayWindow.TargetElement.IsVisibleChanged += (x, y) =>
{
if (webBrowserOverlayWindow.TargetElement.IsVisible && webBrowserOverlayWindow.Owner.IsVisible)
{
webBrowserOverlayWindow.Show();
}
else
{
webBrowserOverlayWindow.Hide();
}
};
}
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Owner.LocationChanged -= PositionAndResize;
if (TargetElement != null)
{
TargetElement.LayoutUpdated -= PositionAndResize;
}
}
private void PositionAndResize(object sender, EventArgs e)
{
if (TargetElement != null && TargetElement.IsVisible)
{
var point = TargetElement.PointToScreen(new Point());
Left = point.X;
Top = point.Y;
Height = TargetElement.ActualHeight;
Width = TargetElement.ActualWidth;
}
}
}
}
Generic.xaml ResourceDictionary(在“主题”文件夹中):
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AllowTransparencyIssue">
<Style TargetType="{x:Type local:TransparentWebBrowser}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TransparentWebBrowser}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
TransparentWebBrowser.cs(自定义控件):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace AllowTransparencyIssue
{
public class TransparentWebBrowser : Control
{
private WebBrowserOverlayWindow _WebBrowserOverlayWindow;
public static readonly DependencyProperty TargetElementProperty = DependencyProperty.Register("TargetElement", typeof(FrameworkElement), typeof(TransparentWebBrowser), new PropertyMetadata(TargetElementPropertyChanged));
public FrameworkElement TargetElement
{
get
{
return GetValue(TargetElementProperty) as FrameworkElement;
}
set
{
SetValue(TargetElementProperty, value);
}
}
public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(string), typeof(TransparentWebBrowser), new PropertyMetadata(SourcePropertyChanged));
public string Source
{
get
{
return GetValue(SourceProperty) as string;
}
set
{
SetValue(SourceProperty, value);
}
}
private static void SourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
var transparentWebBrowser = sender as TransparentWebBrowser;
if (transparentWebBrowser != null)
{
transparentWebBrowser._WebBrowserOverlayWindow.Source = args.NewValue as string;
}
}
private static void TargetElementPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
var transparentWebBrowser = sender as TransparentWebBrowser;
if (transparentWebBrowser != null)
{
transparentWebBrowser._WebBrowserOverlayWindow.TargetElement = args.NewValue as FrameworkElement;
}
}
public TransparentWebBrowser()
{
_WebBrowserOverlayWindow = new WebBrowserOverlayWindow();
//TODO: Figure out how to automatically set the TargetElement binding...
//var targetElementBinding = new Binding();
//var rs = new RelativeSource();
//rs.AncestorType = typeof(Border);
//targetElementBinding.RelativeSource = rs;
//_WebBrowserOverlayWindow.SetBinding(TransparentWebBrowser.TargetElementProperty, targetElementBinding);
}
static TransparentWebBrowser()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TransparentWebBrowser), new FrameworkPropertyMetadata(typeof(TransparentWebBrowser)));
}
}
}
修改后的 MainWindow.xaml:
<Window x:Class="AllowTransparencyIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AllowTransparencyIssue"
Title="MainWindow"
Height="500"
Width="700"
AllowsTransparency="True"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
>
<Border BorderBrush="Blue" BorderThickness="3">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0" HorizontalAlignment="Right" Click="Button_Click">Close Window</Button>
<TabControl Grid.Row="1">
<TabControl.Items>
<TabItem Header="StartPage.com">
<TabItem.Content>
<Border>
<local:TransparentWebBrowser TargetElement="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}}" Source="http://www.startpage.com" />
</Border>
</TabItem.Content>
</TabItem>
<TabItem Header="Google.com">
<TabItem.Content>
<Border>
<local:TransparentWebBrowser TargetElement="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}}" Source="http://www.google.com" />
</Border>
</TabItem.Content>
</TabItem>
<TabItem Header="Bing.com">
<TabItem.Content>
<Border>
<local:TransparentWebBrowser TargetElement="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}}" Source="http://www.bing.com" />
</Border>
</TabItem.Content>
</TabItem>
</TabControl.Items>
</TabControl>
</Grid>
</Border>
</Window>
证明此功能有效的屏幕截图:
我最后的想法和我的回答问题是,任何人都可以弄清楚如何在“TransparentWebBrowser”类的实例构造函数中连接绑定(bind)代码,这样我就不必在 MainWindow 中显式设置 TargetElement 属性.xaml???
关于wpf - 如何解决 AllowsTransparency=true 的 WPF 窗口中的 ActiveX WebBrowser 缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529824/
运行这一行: webbrowser.open(page.path, new=0, autoraise=True) 我总是在新标签页中打开页面。 我怎样才能将它放在与它应该使用 new=0 相同的选项卡
基于 MSDN 上的这篇文章:How To Determine When a Page Is Done Loading in WebBrowser Control ,并且从过去关于 StackOver
我不明白为什么这行简单的代码行不通: // Bulding tree var declaration = new XDeclaration("1.0", "UTF-8", "yes"); var ro
这些是等价的吗? WebBrowser.Navigate('http://google.com'); 和 WebBrowser.Stop(); WebBrowser.Navigate('http://
我需要获取有关 Webbrowser 的滚动条(位置、大小、可见性)的信息控制外部应用程序,我尝试使用 GetScrollBarInfo来 self 之前的功能 question ,但该函数总是返回
目前在带有 WebBrowser 的 vb6 项目中,我遇到了一个问题。我想在我的应用程序中显示 adsense 广告,所以我创建了一个 html 页面并将文件放入服务器(adsense 批准),我尝
Windows Phone 8 应用程序,WebBrowser 控件。我通过 NavigateToString 加载了一大块 HTML (设置后 IsScriptEnabled=true )。一段时间
我有一个嵌入 WebBrowser 的 native Windows 应用程序, IE。 CLSID_WebBrowser 8856F961-340A-11D0-A96B-00C04FD705A2 S
提前致谢。 在我的应用程序中,我将 WebBrowser 控件替换为 Microsoft 的 WebView2 . 我想知道 WebView2 中 WebBrowser 控件的以下成员的等价物。 We
我怎样才能让 Web 浏览器调用自定义方案来启动 Activity,然后我想按下后退按钮但不返回 Web 浏览器。 我只想在调用网络浏览器然后调用我的方案启动另一个 Activity 时实现转发。当我
我们的目标是:嵌入在 .net winform 中的支持 Watin 的浏览器测试。 目前,我们正在使用 .net WebBrowser 控件将浏览器行为嵌入到 winform 中。我们使用如下代码将
我正在使用将 WebBrowser 控件嵌入到 Windows 窗体中的应用程序,我注意到一个严重的内存泄漏问题。在阅读了互联网上的其他类似案例后,问题似乎出在 IE 上。 我问过其他人是如何解决这个
我使用了“LoadCompleted”事件,基本上一旦收到该事件,我就需要截取屏幕截图(我已经构建)。问题是一旦这个事件结束,屏幕截图就只是空白(页面还没有加载),只有当我延迟 5-10 秒时,屏幕截
我试图自动打开多个用户配置文件,给定几个不同网站上的名称列表,但我找不到在新窗口中打开链接的方法,这意味着我无法对我打开的不同网站进行排序自己的橱窗收藏。 这是我的代码: import webbrow
我使用 vb.net + wpf+ System.Windows.Forms.WebBrowser 在 wpf 表单上显示网页内容。 此网站“http://manuim.com/laisha/”在控件
有没有办法检查用户是否安装了 PDF 阅读器? 也许使用 ActiveX 组件? 请你帮助我好吗? 最佳答案 不,我不这么认为 - 但默认情况下你总是可以通过谷歌的 PDF 阅读器直接链接你的链接 -
尝试在 WPF(C#/XAML、.NET 4.0)WebBrowser 应用程序中测试基本浏览器概念。到目前为止,唯一的问题是以编程方式缩放。有没有人有这方面的经验? MSDN 没有列出任何内容:ht
首先是一些定义,以保持清楚。 User: A live person, using the software Client: A company that is paying for a custom
尝试使用 webBrowser.Navigate("https://home.nest.com/") 加载页面时,我不断收到脚本错误.它会从我的普通互联网浏览器中正常显示,但不会在我的程序中显示。 谁
显然,WPF WebBrowser control 存在一些严重的键盘和焦点问题。 .我已经组装了一个简单的 WPF 应用程序,只有一个 WebBrowser 和两个按钮。该应用程序加载一个非常基本的
我是一名优秀的程序员,十分优秀!