繁体   English   中英

使用C#中的WebBrowser进行用户控制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM