2010-10-12 110 views
5

好吧,所以我认为这将会非常简单,即使我以前刚刚使用WPF项目资源文件时也是如此。将项目资源加载到WPF Web浏览器控件中

当我的应用程序启动时,我想将一个本地(附带应用程序)HTML文件加载到Webbrowser控件中。不过,我找不到一个简单的方法来做到这一点!有任何想法吗?

回答

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的方式工作。 WebBrowser具有NavigateToStream()方法,因此您可以简单地设置资源流。

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

这样你可以保留它一个资源,你不必将它复制到磁盘。

0

我把它封装在一个用户控件中,以处理WebBrowser控件的一些问题。 设置Html页面的'Build Action'属性,以及将任何嵌入内容设置为'Content'和'Copy to Output目录“复制到”如果更新的情况下复制“。 在html中维护任何页面资源层次结构,就像您通常在服务器上一样。 在视图模型,或从代码隐藏,则只需设置HtmlUri,HtmlString或该控制(也可以关掉烦人点击声; O)的HtmlStream特性之一..

实施例的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"); 
} 

使用这样的:

<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. 设置复制到输出目录复制如果更新
  3. 使用下列URI方案:

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

随着.NET 4.5,这是对我工作的罚款。

+0

_Best_答案为.NET 4.5 +。打包网址可让您在.html文件中使用图片和其他资源。 – 2018-02-23 17:03:35