2010-10-12 15 views
5

ठीक है, इसलिए मैंने सोचा कि यह वास्तव में सरल है, भले ही मैं केवल अभी जब WPF परियोजना संसाधन फाइलों के साथ काम पहले से द्वारा मिल गया है हो सकता है में एक परियोजना संसाधन।लोड एक WPF WebBrowser नियंत्रण

जब अपने आवेदन मैं एक स्थानीय WebBrowser नियंत्रण में html फ़ाइल (आवेदन के साथ भेज दिया) में लोड करना चाहते हैं शुरू होता है। हालांकि मुझे ऐसा करने का आसान तरीका नहीं मिल रहा है! कोई विचार?

उत्तर

4

'हमेशा कॉपी' के लिए फ़ाइल का निर्माण कार्रवाई करना और फिर Environment.CurrentDirectory का उपयोग कर अनुप्रयोग निर्देशिका पाने के लिए द्वारा अंत में मिल गया इस दौर:

string appDir = Environment.CurrentDirectory; 
Uri pageUri = new Uri(appDir + "/page.html"); 
myWebBrowser.Source = pageUri; 

ठीक से काम करने लगता है यही कारण है कि।

7

मैं अभी इस समस्या में भाग गया। मैं बस यह करने के लिए उम्मीद कर रहा था:

<WebBrowser x:Name="myWebBrowser" Source="page.html"/> 

लेकिन बजाय, मैं इस त्रुटि मिलती है:

Relative URIs are not allowed. Parameter name: source

ताकि कष्टप्रद है। इसके बजाय, मैं बहुत पीछे कोड में आपसे मिलते-जुलते एक समाधान के साथ समाप्त हो गया:

myWebBrowser.Source = new Uri(new System.IO.FileInfo("page.html").FullName); 

मैं वहाँ कुछ XAML नट जिसके साथ कि समस्या के समाधान पाने के लिए कुंग फू विधि यकीन है, लेकिन मैं कोई सुराग नहीं है यह क्या है।^_^

2

दिखाने के लिए देर हो चुकी है, लेकिन मैं इस पर ठोकर खाई है जब मैं एक ही बात के लिए देख रहा था। इसे एक और WPF फैशन तरीके से काम करने के लिए मिला। वेबब्राउज़र में एक विधि NavigateToStream() है ताकि आप संसाधन स्ट्रीम को बस सेट कर सकें।

StreamResourceInfo info = Application.GetResourceStream(new Uri("Page.html", UriKind.Relative)); 
if (info != null) 
    myWebBrowser.NavigateToStream(info.Stream); 

इस तरह आप इसे संसाधन बना सकते हैं और आपको इसे डिस्क पर कॉपी करने की आवश्यकता नहीं है।

0

मैंने वेबब्राउज़र नियंत्रण के साथ कुछ मुद्दों से निपटने के लिए इसे उपयोगकर्ता नियंत्रण में लपेट लिया .. एचटीएमएल पृष्ठों की 'बिल्ड एक्शन' संपत्ति सेट करें, और किसी भी एम्बेडेड सामग्री को 'सामग्री' और 'कॉपी टू आउटपुट' पर सेट करें डायरेक्टरी 'टू' अगर नई 'कॉपी करें। एचटीएमएल में किसी भी पेज संसाधन पदानुक्रम को बनाए रखें जैसा कि आप आमतौर पर सर्वर पर करेंगे।

: ..

उदाहरण उरी; viewmodel में, या से कोड-पीछे, तो आप सिर्फ HtmlUri, HtmlString या इस पर नियंत्रण (ओ तुम भी कष्टप्रद क्लिक ध्वनि बंद कर सकते हैं) की HtmlStream संपत्ति में से एक सेट

public Uri DefaultUri 
{ 
    get { return new Uri(@"pack://siteoforigin:,,,/Html/h1.html"); } 
} 

private Uri GetUri(string ItemName) 
{ 
    if (string.IsNullOrEmpty(ItemName)) return null; 

    return new Uri(@"pack://siteoforigin:,,,/Html/" + ItemName + ".html"); 
} 

इस तरह का प्रयोग करें यह:

<controls:SmartBrowser x:Name="wbData" 
         Grid.Row="0" 
         HtmlUri="{Binding HtmlUri}" 
         DefaultUri="{Binding DefaultUri}" /> 

SmartBrowser।XAML:

<Grid> 
    <WebBrowser Name="wbData" /> 
</Grid> 

नियंत्रण कोड-पीछे:

public partial class SmartBrowser : UserControl 
{ 
    #region Constants 
    private const int Feature = 21; 
    private const int SetFeatureOnProcess = 0x00000002; 
    #endregion 

    #region Api 
    [DllImport("urlmon.dll")] 
    [PreserveSig] 
    [return: MarshalAs(UnmanagedType.Error)] 
    static extern int CoInternetSetFeatureEnabled(int featureEntry, [MarshalAs(UnmanagedType.U4)] int dwFlags, bool fEnable); 
    #endregion 

    #region Fields 
    private WebBrowser _wbData; 
    #endregion 

    #region Constructor 
    public SmartBrowser() 
    { 
     InitializeComponent(); 
    } 
    #endregion 

    #region Overrides 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     _wbData = (WebBrowser)FindElement("wbData"); 
     if (_wbData != null) 
      if (DefaultUri != null) 
       _wbData.Navigate(DefaultUri); 
    } 
    #endregion 

    #region Properties 
    #region DefaultUri 
    /// <summary> 
    /// Gets/Sets 
    /// </summary> 
    public static readonly DependencyProperty DefaultUriProperty = 
     DependencyProperty.Register("DefaultUri", typeof(Uri), typeof(SmartBrowser), 
      new PropertyMetadata(null, new PropertyChangedCallback(OnDefaultUriChanged))); 

    public Uri DefaultUri 
    { 
     get { return (Uri)GetValue(DefaultUriProperty); } 
     set { SetValue(DefaultUriProperty, value); } 
    } 

    private static void OnDefaultUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     SmartBrowser sb = d as SmartBrowser; 

     if (e.NewValue == null) return; 
     if (sb._wbData == null) return; 

     Uri htmlUri = e.NewValue as Uri; 
     sb._wbData.Navigate(htmlUri); 
    } 
    #endregion 

    #region HtmlStream 
    /// <summary> 
    /// Gets/Sets 
    /// </summary> 
    public static readonly DependencyProperty HtmlStreamProperty = 
     DependencyProperty.Register("HtmlStream", typeof(Stream), typeof(SmartBrowser), 
      new PropertyMetadata(null, new PropertyChangedCallback(OnHtmlStreamChanged))); 

    public Stream HtmlStream 
    { 
     get { return (Stream)GetValue(HtmlStreamProperty); } 
     set { SetValue(HtmlStreamProperty, value); } 
    } 

    private static void OnHtmlStreamChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     SmartBrowser sb = d as SmartBrowser; 

     if (e.NewValue == null) return; 
     if (sb._wbData == null) return; 

     Stream htmlStream = e.NewValue as Stream; 
     sb.Navigate(htmlStream); 
    } 
    #endregion 

    #region HtmlString 
    /// <summary> 
    /// Gets/Sets 
    /// </summary> 
    public static readonly DependencyProperty HtmlStringProperty = 
     DependencyProperty.Register("HtmlString", typeof(string), typeof(SmartBrowser), 
      new PropertyMetadata(null, new PropertyChangedCallback(OnHtmlStringChanged))); 

    public string HtmlString 
    { 
     get { return (string)GetValue(HtmlStringProperty); } 
     set { SetValue(HtmlStringProperty, value); } 
    } 

    private static void OnHtmlStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     SmartBrowser sb = d as SmartBrowser; 

     if (e.NewValue == null) return; 
     if (sb._wbData == null) return; 

     string htmlString = e.NewValue as string; 

     sb.Navigate(htmlString); 
    } 
    #endregion 

    #region HtmlUri 
    /// <summary> 
    /// Gets/Sets 
    /// </summary> 
    public static readonly DependencyProperty HtmlUriProperty = 
     DependencyProperty.Register("HtmlUri", typeof(Uri), typeof(SmartBrowser), 
      new PropertyMetadata(null, new PropertyChangedCallback(OnHtmlUriChanged))); 

    public Uri HtmlUri 
    { 
     get { return (Uri)GetValue(HtmlUriProperty); } 
     set { SetValue(HtmlUriProperty, value); } 
    } 

    private static void OnHtmlUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     SmartBrowser sb = d as SmartBrowser; 

     if (e.NewValue == null) return; 
     if (sb._wbData == null) return; 

     Uri htmlUri = e.NewValue as Uri; 
     sb.Navigate(htmlUri); 
    } 
    #endregion 

    #region SoundEffects 
    /// <summary> 
    /// Gets/Sets 
    /// </summary> 
    public static readonly DependencyProperty SoundEffectsProperty = 
     DependencyProperty.Register("SoundEffects", typeof(bool), typeof(SmartBrowser), 
      new PropertyMetadata(false, new PropertyChangedCallback(OnSoundEffectsChanged))); 

    public bool SoundEffects 
    { 
     get { return (bool)GetValue(SoundEffectsProperty); } 
     set { SetValue(SoundEffectsProperty, value); } 
    } 

    private static void OnSoundEffectsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     SmartBrowser sb = d as SmartBrowser; 

     if (e.NewValue == null) return; 
     if (sb._wbData == null) return; 

     bool enable = (bool)e.NewValue; 

     sb.EnableSoundEffects(enable); 
    } 
    #endregion 
    #endregion 

    #region Methods 
    private void EnableSoundEffects(bool Enable) 
    { 
     try 
     { 
      CoInternetSetFeatureEnabled(Feature, SetFeatureOnProcess, !Enable); 
     } 
     catch { } 
    } 

    private void Navigate(Uri Html) 
    { 
     if (Html == null) return; 

     try 
     { 
      _wbData.Navigate(Html); 
     } 
     catch { } 
    } 

    private void Navigate(string Html) 
    { 
     if (string.IsNullOrEmpty(Html)) return; 

     try 
     { 
      _wbData.NavigateToString(Html); 
     } 
     catch { } 
    } 

    private void Navigate(Stream Html) 
    { 
     if (Html == null) return; 

     try 
     { 
      _wbData.NavigateToStream(Html); 
     } 
     catch { } 
    } 
    #endregion 

    #region Helpers 
    /// <summary> 
    /// Find an element in the visual tree 
    /// </summary> 
    /// <param name="name">Element name</param> 
    /// <returns>Element [object]</returns> 
    private object FindElement(string name) 
    { 
     try 
     { 
      if (this.Template != null) 
       return this.FindName(name); 
     } 
     catch { } 
     return null; 
    } 
    #endregion 
} 
2

सेट फ़ाइल के "कार्रवाई का निर्माण" "संसाधन एंबेडेड" करने के लिए और फिर इस का उपयोग करें:

webBrowserMain.NavigateToStream(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("PsHandler.Resources.gnu.html")); 

यहाँ कैसे यह है प्रोजेक्ट में दिखता है: http://i.stack.imgur.com/dGkpH.png

2

आप इसके बजाय निम्न योजना का उपयोग करना चाह सकते हैं:

  1. सामग्री करने के लिए अपने संसाधन के बिल्ड कार्रवाई बदलें।
  2. सेट आउटपुट निर्देशिका से पर कॉपी करें यदि कॉपी करें।

    <WebBrowser Source="pack://siteoforigin:,,,/Resources/page1.html" /> 
    

.NET 4.5 के रूप में, यह मेरे लिए ठीक काम कर रहा है:

  • निम्नलिखित URI योजना का प्रयोग करें।

  • +0

    .NET 4.5+ के लिए _Best_ उत्तर। पैक यूआरएल आपको .html फ़ाइल के अंदर छवियों और अन्य संसाधनों का उपयोग करने देता है। –

    संबंधित मुद्दे