将项目资源加载到WPF Web浏览器控件中
好吧,所以我认为这将会非常简单,即使我以前刚刚使用WPF项目资源文件时也是如此。将项目资源加载到WPF Web浏览器控件中
当我的应用程序启动时,我想将一个本地(附带应用程序)HTML文件加载到Webbrowser控件中。不过,我找不到一个简单的方法来做到这一点!有任何想法吗?
了这一轮以文件的生成操作“始终复制”设置,然后使用Environment.CurrentDirectory
获取应用程序目录末尾:
string appDir = Environment.CurrentDirectory;
Uri pageUri = new Uri(appDir + "/page.html");
myWebBrowser.Source = pageUri;
这似乎很好地工作。
我刚才遇到了同样的问题。我希望能简单地做到这一点:
<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的柔术功夫方法,用以避开这个问题,但我不知道是什么是。^_^
展会结束后,我在找同样的东西时偶然发现了这个。得到它以更WPF的方式工作。 WebBrowser具有NavigateToStream()方法,因此您可以简单地设置资源流。
StreamResourceInfo info = Application.GetResourceStream(new Uri("Page.html", UriKind.Relative));
if (info != null)
myWebBrowser.NavigateToStream(info.Stream);
这样你可以保留它一个资源,你不必将它复制到磁盘。
我把它封装在一个用户控件中,以处理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
}
集 “建设行动” 的文件,以 “嵌入的资源”,然后使用此:
webBrowserMain.NavigateToStream(System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream("PsHandler.Resources.gnu.html"));
这是怎么了在项目中寻找:http://i.stack.imgur.com/dGkpH.png
您可能想改为使用以下方案:
- 你的资源的生成操作更改为内容。
- 设置复制到输出目录到复制如果更新。
-
使用下列URI方案:
<WebBrowser Source="pack://siteoforigin:,,,/Resources/page1.html" />
随着.NET 4.5,这是对我工作的罚款。
_Best_答案为.NET 4.5 +。打包网址可让您在.html文件中使用图片和其他资源。 – 2018-02-23 17:03:35