[英]User control with WebBrowser in C#
我正在使用WebBrowser和一个依赖项属性编写用户控件。 更改文本后,我想刷新浏览器输出。
public class BrowserControl : Control
{
//....
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Text", typeof(object), typeof(BrowserControl), new UIPropertyMetadata(null));
public String Text
{
get { return (String)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value);
br = new WebBrowser();
br.NavigateToString(value);
}
}
private WebBrowser br;
public WebBrowser Browser { get; set; }
}
我已经将此控件放在wpf应用程序中,但是控件没有输出。 我认为我必须修改控制模板。 常规模板如下所示:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BrowserControl">
<Style TargetType="{x:Type local:BrowserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:BrowserControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
我对此并不陌生,不知道如何将webbrowser作为整个控件的可见元素?
我也想知道如何在WPF应用程序中将Binding与TextBox和BrowserControl的Text属性一起使用。 我想做某事:
<TextBox ... Text="{Binding Path=browserCtrl.Text}" ...>
因此,当TextBox中的文本更改时,我的自定义控件将在浏览器中重新呈现该网站。
我认为这可能对您有帮助。
只需键入URL并关闭即可。
BrowserControl.cs
public class BrowserControl : Control
{
public static readonly DependencyProperty URLproperty
= DependencyProperty.Register(
"URL",
typeof (string),
typeof (BrowserControl),
new PropertyMetadata(string.Empty, OnURLPropertyChanged),
OnValidateURLCallBack);
private static bool OnValidateURLCallBack(object value)
{
Uri uri = null;
var url = Convert.ToString(value);
if (!string.IsNullOrEmpty(url))
{
return Uri.TryCreate(Convert.ToString(value), UriKind.Absolute, out uri);
}
return true;
}
private static void OnURLPropertyChanged(object sender, DependencyPropertyChangedEventArgs args)
{
var browserControl = sender as BrowserControl;
if (browserControl != null)
{
Uri uri = null;
var url = Convert.ToString(args.NewValue);
var template = browserControl.Template;
if (template != null)
{
var internalBrowser =
browserControl.Template.FindName("_InternalBrowser", browserControl) as WebBrowser;
if (internalBrowser != null)
{
if (!string.IsNullOrEmpty(url) && Uri.TryCreate(url, UriKind.Absolute, out uri))
{
internalBrowser.Navigate(uri);
}
else if (string.IsNullOrEmpty(url))
{
internalBrowser.NavigateToStream(new MemoryStream(Encoding.ASCII.GetBytes(string.Empty)));
}
}
}
}
}
public string URL
{
get { return Convert.ToString(GetValue(URLproperty)); }
set { SetValue(URLproperty, value); }
}
}
Generic.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<Style TargetType="{x:Type local:BrowserControl}" x:Key="{x:Type local:BrowserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:BrowserControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<WebBrowser x:Name="_InternalBrowser"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="BrowserHost" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Margin="2">
<TextBlock FontWeight="Bold" Text="URL: " Margin="1" DockPanel.Dock="Left"/>
<TextBox Text="{Binding ElementName=MyBrowserControl, Path=URL, Mode=TwoWay}" DockPanel.Dock="Right"/>
</DockPanel>
<local:BrowserControl x:Name="MyBrowserControl" Grid.Row="1" BorderBrush="Blue" BorderThickness="1">
</local:BrowserControl>
</Grid>
</Window>
您可能会发现使用UserControl
类更容易...只需将WebBrowser
控件添加到UserControl
XAML中,然后将DependencyProperty
添加到后面的代码中:
<UserControl x:Class="WpfApplication1.Views.WebBrowserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<WebBrowser Name="WebBrowser" /><!--Declare this here, not in code behind-->
</UserControl>
对于第二个要求,您应该研究WebBrowser.WebBrowser.Navigate
和/或WebBrowser.NavigateToString
方法。
最后,要对DependencyProperty
更改做出反应,您需要添加一个PropertyChangedCallback
处理程序。 您可以通过查看MSDN上的“ 依赖项属性回调和验证”页面来了解如何执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.