[C#] WPF에서 WebBrowser의 Source 속성에 데이터 바인딩



Answers

DependencyProperties를 사용하는 래퍼 usercontrol을 작성했습니다.

XAML :

<UserControl x:Class="HtmlBox">
    <WebBrowser x:Name="browser" />
</UserControl>

기음#:

public static readonly DependencyProperty HtmlTextProperty = DependencyProperty.Register("HtmlText", typeof(string), typeof(HtmlBox));

public string HtmlText {
    get { return (string)GetValue(HtmlTextProperty); }
    set { SetValue(HtmlTextProperty, value); }
}

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) {
    base.OnPropertyChanged(e);
    if (e.Property == HtmlTextProperty) {
        DoBrowse();
    }
}
 private void DoBrowse() {
    if (!string.IsNullOrEmpty(HtmlText)) {
        browser.NavigateToString(HtmlText);
    }
}

다음과 같이 사용하십시오.

<Controls:HtmlBox HtmlText="{Binding MyHtml}"  />

이 문제가있는 유일한 문제는 WebBrowser 컨트롤이 "순수한"wpf가 아니라는 것입니다. 실제로는 win32 구성 요소의 래퍼입니다. 이것은 컨트롤이 Z- 인덱스를 존중하지 않고 항상 다른 요소를 오버레이 함을 의미합니다 (예 : scrollviewer에서 이것은 몇 가지 문제를 일으킬 수 있음) MSDN 에서 win32-wpf 문제에 대한 추가 정보

Question

누구든지 WPF (3.5SP1)에서 WebBrowser의 .Source 속성을 databind하는 방법을 알고 있습니까? 왼쪽에 작은 WebBrowser가 있고 오른쪽에 내용이 있고 목록 항목에 바인딩 된 각 개체의 URI가있는 각 WebBrowser의 원본을 데이터 바인딩하려는 listview가 있습니다.

이것은 지금까지 개념 증명으로 가지고 있지만 " <WebBrowser Source="{Binding Path=WebAddress}" "는 컴파일되지 않습니다.

<DataTemplate x:Key="dealerLocatorLayout" DataType="DealerLocatorAddress">                
    <StackPanel Orientation="Horizontal">
         <!--Web Control Here-->
        <WebBrowser Source="{Binding Path=WebAddress}"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
            ScrollViewer.VerticalScrollBarVisibility="Disabled" 
            Width="300"
            Height="200"
            />
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Path=CompanyName}" FontWeight="Bold" Foreground="Blue" />
                <TextBox Text="{Binding Path=DisplayName}" FontWeight="Bold" />
            </StackPanel>
            <TextBox Text="{Binding Path=Street[0]}" />
            <TextBox Text="{Binding Path=Street[1]}" />
            <TextBox Text="{Binding Path=PhoneNumber}"/>
            <TextBox Text="{Binding Path=FaxNumber}"/>
            <TextBox Text="{Binding Path=Email}"/>
            <TextBox Text="{Binding Path=WebAddress}"/>
        </StackPanel>
    </StackPanel>
</DataTemplate>



멋진 생각 토드.

Silverlight 4에서 RichTextBox.Selection.Text와 비슷한 작업을 수행했습니다. 귀하의 게시물을 가져 주셔서 감사합니다. 잘 작동합니다.

public class RichTextBoxHelper
{
    public static readonly DependencyProperty BindableSelectionTextProperty =
       DependencyProperty.RegisterAttached("BindableSelectionText", typeof(string), 
       typeof(RichTextBoxHelper), new PropertyMetadata(null, BindableSelectionTextPropertyChanged));

    public static string GetBindableSelectionText(DependencyObject obj)
    {
        return (string)obj.GetValue(BindableSelectionTextProperty);
    }

    public static void SetBindableSelectionText(DependencyObject obj, string value)
    {
        obj.SetValue(BindableSelectionTextProperty, value);
    }

    public static void BindableSelectionTextPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        RichTextBox rtb = o as RichTextBox;
        if (rtb != null)
        {
            string text = e.NewValue as string;
            if (text != null)
                rtb.Selection.Text = text;
        }
    }
}    

다음은 Xaml-Code입니다.

<RichTextBox IsReadOnly='False' TextWrapping='Wrap' utilities:RichTextBoxHelper.BindableSelectionText="{Binding Content}"/>



이것은 토드 (Todd)와 사무엘 (Samuel)이 기본 논리 전제를 활용하고 널 병합 연산자를 사용하는 것에 대한 해답입니다.

public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    WebBrowser browser = o as WebBrowser;

    if ((browser != null) && (e.NewValue != null))
        browser.Source = e.NewValue as Uri ?? new Uri((string)e.NewValue);

}
  1. 브라우저가 null이거나 위치가 null 인 경우 null 페이지를 사용하거나 탐색 할 수 없습니다.
  2. # 1의 아이템이 null가 아닌 경우, 할당 할 때, 새로운 값이 URI 인 경우는 그것을 사용합니다. URI가 null이고 URI가 null이면 결합은 URI에 넣을 수있는 문자열이어야합니다. # 1은 문자열이 null 일 수 없도록 강제하기 때문입니다.



Links