2013-12-05 3 views
0

Я пишу пользовательский контроль с помощью WebBrowser и одного свойства зависимостей. После изменения в тексте я хотел бы обновить вывод браузера.Пользовательский контроль с помощью WebBrowser в C#

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, как видимый элемент всего элемента управления?

Также я хотел бы знать, как использовать привязку с TextBox и свойство Text BrowserControl в приложении WPF. Я хочу сделать что-н, как:

<TextBox ... Text="{Binding Path=browserCtrl.Text}" ...> 

Так что, когда текст в TextBox изменить пользовательский элемент управления будет засавить сайта в браузере.

ответ

0

Я думаю, что это может помочь вам ....

просто введите 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> 
+0

Это именно то, что я хочу, но связывание не работает. У меня есть Text = "{Binding ElementName = browserCtrl, Path = Text, Mode = TwoWay}" и . Мой элемент управления находится в другом проекте, основной ссылке на использование приложения. Все работает, если я использую событие textChanged. – tobix10

+0

Я понял. UpdateSourceTrigger = PropertyChanged, и он работает. – tobix10

+0

Вы не должны использовать UpdateSourceTrigger = PropertyChanged, поскольку это вызовет WebBrowser.Navigate() для каждого нажатия клавиши печати, которое вы будете выполнять в текстовом поле! Причина, по которой ваша привязка не работает, заключается в том, что вам необходимо разрешить ваше пространство имен «local». Ищите онлайн-справку для правильного разрешения пространства имен. –

0

Вы можете найти его проще использовать 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. Вы можете узнать, как это сделать, просмотрев страницу Dependency Property Callbacks and Validation на MSDN.

Смежные вопросы