2010-10-12 41 views
5

OK, vì vậy tôi nghĩ điều này sẽ thực sự đơn giản mặc dù tôi chỉ mới có trước đây khi làm việc với các tệp tài nguyên dự án WPF.Tải tài nguyên dự án vào điều khiển WPF Webbrowser

Khi ứng dụng của tôi bắt đầu, tôi muốn tải tệp html cục bộ (được gửi kèm ứng dụng) vào điều khiển Webbrowser. Tuy nhiên tôi không thể tìm thấy một cách dễ dàng để làm điều này! Bất kỳ ý tưởng?

Trả lời

4

Got vòng này vào cuối bằng cách thiết lập xây dựng hoạt động của các tập tin để 'Sao chép Luôn' và sau đó sử dụng Environment.CurrentDirectory để có được những thư mục ứng dụng:

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

Đó dường như làm việc tốt.

7

Tôi vừa mới gặp sự cố tương tự. Tôi đã hy vọng chỉ đơn giản là làm điều này:

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

Nhưng thay vào đó, tôi nhận được lỗi này:

Relative URIs are not allowed. Parameter name: source

Vì vậy, đó là gây phiền nhiễu. Thay vào đó, tôi đã kết thúc với một giải pháp rất giống như của bạn trong mã đằng sau:

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

tôi chắc chắn rằng có một số XAML uốn dẻo phương pháp kung-fu mà để có được xung quanh vấn đề đó, nhưng tôi không có đầu mối những gì nó Là.^_^

2

Đến cuối chương trình, nhưng tôi tình cờ gặp phải điều này khi tôi đang tìm kiếm cùng một thứ. Làm cho nó hoạt động theo cách WPF hơn. WebBrowser có một phương thức NavigateToStream() để bạn có thể chỉ cần thiết lập Luồng tài nguyên.

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

Bằng cách này bạn có thể giữ tài nguyên và bạn không phải sao chép tài nguyên vào đĩa.

0

Tôi đã bao gồm điều này trong một điều khiển người dùng để xử lý một số vấn đề với điều khiển WebBrowser .. Đặt thuộc tính 'Xây dựng hành động' của các trang Html và bất kỳ nội dung được nhúng nào thành 'Nội dung' và 'Sao chép sang đầu ra Thư mục 'đến' Sao chép nếu mới hơn '. Duy trì bất kỳ phân cấp tài nguyên trang nào trong html giống như bình thường trên máy chủ. Trong viewmodel, hoặc từ mã-đằng sau, bạn chỉ cần thiết lập một trong những HtmlUri, HtmlString hoặc tài sản HtmlStream kiểm soát này (bạn cũng có thể tắt âm thanh nhấp chuột gây phiền nhiễu; o) ..

Ví dụ Uri:

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"); 
} 

Sử dụng nó như thế này:

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

SmartBrowser.XAML:

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

kiểm soát code-behind:

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

Set "Xây dựng hành động" của tập tin để "Embedded Resource" và sau đó sử dụng này:

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

Sau đây là cách nó trông trong dự án: http://i.stack.imgur.com/dGkpH.png

2

Bạn có thể muốn sử dụng sơ đồ sau để thay thế:

  1. Thay đổi tài nguyên của bạn Xây dựng hành động đến Nội dung.
  2. Đặt Sao chép vào thư mục đầu ra đến Sao chép nếu mới hơn.
  3. Sử dụng giao thức URI sau:

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

Tính đến .NET 4.5, điều này đang làm việc tốt cho tôi.

+0

_Best_ câu trả lời cho .NET 4.5+. Url gói cho phép bạn sử dụng hình ảnh và các tài nguyên khác bên trong tệp .html. –

Các vấn đề liên quan