WPF में WebBrowser के स्रोत गुण को डेटाबाइंड करें


85

क्या किसी को पता है कि डेटाबेस को कैसे नष्ट किया जाए। WPF (3.5SP1) में WebBrowser की संपत्ति? मेरे पास एक सूची है कि मैं बाईं ओर एक छोटा वेबब्राउजर रखना चाहता हूं, और दाईं ओर सामग्री, और सूची आइटम के लिए बाध्य प्रत्येक ऑब्जेक्ट में यूआरआई के साथ प्रत्येक वेबब्राउजर के स्रोत को डेटाबाइंड करना है।

यह वही है जो मेरे पास अब तक अवधारणा के प्रमाण के रूप में है, लेकिन " <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>

जवाबों:


157

समस्या यह है कि WebBrowser.Sourceए नहीं है DependencyPropertyAttachedPropertyइस क्षमता को सक्षम करने के लिए कुछ जादू का उपयोग करना होगा ।

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}"/>

9
स्ट्रिंग के रूप में "नई उड़ी (यूआरआई)" पर एक अपवाद प्राप्त करना "" है। शायद यह होना चाहिए .... ब्राउज़र। स्रोत = string.sNullOrEmpty (uri)? null: नई उरी (उरी);
मध्याह्न

5
ध्यान दें कि यह केवल एक ही तरह से बाध्यकारी है और वेब ब्राउज़र पेज बदलने पर BindableSource गुण नहीं बदलेगा।
कुर्रेन

1
एक नौसिखिया के रूप में यह मेरे लिए थोड़ा मुश्किल था - संपत्ति में बदलाव के लिए एक अद्यतन घटना के साथ बाध्य ViewModel में "WebAddress" के लिए एक निजी-सार्वजनिक गटर सेटर होने के बारे में कुछ लिखने से मदद मिली होगी। इस परियोजना का एक समान उदाहरण है। github.com/thoemmi/WebBrowserHelper
pgee70

धन्यवाद। मैंने इसे लिया और "Html" संपत्ति को लागू करने के लिए इसे संशोधित किया, जो हुड के तहत NavigateToString को कॉल करता है।
एंटनी स्कॉट

@ pgee70 धन्यवाद, मैं अपने GitHub उदाहरण का पालन किया और एक का इलाज काम करता है
percentum

33

मैंने टोड के उत्कृष्ट उत्तर में संशोधन किया है, एक ऐसा संस्करण तैयार करने के लिए, जो या तो स्ट्रिंग्स या Uris से बाइंडिंग स्रोत से मेल खाता है:

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

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

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

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

        Uri uri = null;

        if (e.NewValue is string )
        {
            var uriString = e.NewValue as string;
            uri = string.IsNullOrWhiteSpace(uriString) ? null : new Uri(uriString);
        }
        else if (e.NewValue is Uri)
        {
            uri = e.NewValue as Uri;
        }

        browser.Source = uri;
    }

31

मैंने एक रैपर यूजरकंट्रोल लिखा था, जो डिपेंडेंसीप्रोपरेट्स का उपयोग करता है:

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}"  />

इसके साथ एक ही परेशानी है कि वेबब्रोज़र नियंत्रण "शुद्ध" wpf नहीं है ... यह वास्तव में एक win32 घटक के लिए सिर्फ एक आवरण है। इसका मतलब यह है कि नियंत्रण z- इंडेक्स का सम्मान नहीं करेगा, और हमेशा अन्य तत्व को ओवरले करेगा (जैसे: एक स्क्रॉलव्यूअर में यह कुछ परेशानी पैदा कर सकता है) MSDN पर इन win32-wpf मुद्दों के बारे में अधिक जानकारी


यह वही है जो मुझे चाहिए था क्योंकि मैं अपना स्वयं का html प्रदर्शित करना चाहता हूं। नीट, सरल, और मुझे लगभग समझ में आ रहा है कि इसका क्या करना (-:
मर्फ़

3

शांत विचार टोड।

मैंने रिचटचबॉक्स के साथ भी ऐसा ही किया है। चयन। सिल्वरलाइट 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-Code है।

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


0

यह टॉड के लिए एक शोधन है और सैमुअल के कुछ बुनियादी तर्क परिसरों का लाभ उठाने के साथ-साथ अशक्त सहकर्मी ऑपरेटर का उपयोग करने का उत्तर है।

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. यदि ब्राउज़र अशक्त है या स्थान शून्य है, तो हम अशक्त पृष्ठ का उपयोग या नेविगेट नहीं कर सकते हैं।
  2. जब # 1 में आइटम शून्य नहीं हैं तो असाइन करते समय, यदि नया मान URI है तो उसका उपयोग करें। यदि नहीं और यूआरआई शून्य है, तो इसके लिए मोटे तौर पर एक स्ट्रिंग होना चाहिए जिसे यूआरआई में डाला जा सकता है; चूँकि # 1 लागू करता है कि स्ट्रिंग शून्य नहीं हो सकती।

-3

आपको इसे xamlफ़ाइल की पहली कुछ पंक्तियों में घोषित करने की आवश्यकता है जो क्लास फ़ाइल की ओर इशारा कर रही है

xmlns:reportViewer="clr-namespace:CoMS.Modules.Report" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.