свяжите с данными свойство Source WebBrowser в WPF

85
задан H.B. 18 June 2011 в 00:18
поделиться

4 ответа

Проблема - тот WebBrowser. Источником не является DependencyProperty. Одно обходное решение должно было бы использовать некоторое волшебство AttachedProperty включить эту способность.

public static class WebBrowserUtility
{
    public static readonly DependencyProperty BindableSourceProperty =
        DependencyProperty.RegisterAttached("BindableSource", typeof(string), typeof(WebBrowserUtility), new UIPropertyMetadata(null, BindableSourcePropertyChanged));

    public static string GetBindableSource(DependencyObject obj)
    {
        return (string) obj.GetValue(BindableSourceProperty);
    }

    public static void SetBindableSource(DependencyObject obj, string value)
    {
        obj.SetValue(BindableSourceProperty, value);
    }

    public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        WebBrowser browser = o as WebBrowser;
        if (browser != null)
        {
            string uri = e.NewValue as string;
            browser.Source = !String.IsNullOrEmpty(uri) ? new Uri(uri) : null;
        }
    }

}

Тогда в Вашем xaml сделайте:

<WebBrowser ns:WebBrowserUtility.BindableSource="{Binding WebAddress}"/>
154
ответ дан ΩmegaMan 24 November 2019 в 08:12
поделиться

Я написал оболочку usercontrol, которая использует DependencyProperties:

XAML:

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

C #:

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-index и всегда будет перекрывать другой элемент (например: в программе просмотра прокрутки это может вызвать некоторые проблемы) дополнительную информацию об этих проблемах win32-wpf можно найти на MSDN

30
ответ дан 24 November 2019 в 08:12
поделиться

Классная идея Тодда.

Я проделал то же самое с RichTextBox.Selection.Text в Silverlight 4. Спасибо за ваш пост. Работает отлично.

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-код.

<RichTextBox IsReadOnly='False' TextWrapping='Wrap' utilities:RichTextBoxHelper.BindableSelectionText="{Binding Content}"/>
3
ответ дан 24 November 2019 в 08:12
поделиться

Вы также можете использовать специальный отдельный элемент управления прокси . Это применимо не только к случаю WebBrowser, но и к любому подобному элементу управления.

1
ответ дан 24 November 2019 в 08:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: