c# - 访问 C# WPF 应用程序中的资源(同一程序集)

标签 c# wpf xaml visual-studio-2012

(在我进入细节之前,我想设置上下文:我正在尝试加载一个 WPF 框架,其中包含我作为资源包含在我的项目中的 .html 文件的内容。)

我创建了一个新的 WPF 应用程序;我向项目添加了一个名为“foofiles”的新文件夹,并向该文件夹添加了几个文件(page1.foo 和 page2.foo)。

对于每个新添加的 .foo 文件,我右键单击它,转到“属性”,然后将构建操作设置为“资源”,并将“复制到输出目录”设置为“始终复制”。

我希望能够在 XAML 中访问这些文件:

<Frame x:Name="bar" Source="/foofiles/page1.foo"/>

在程序代码中:

private void someFunc()
{
    bar.Source = new Uri("/foofiles/page1.foo");
}

但我只是想不通为什么这不起作用——我收到“无法确定 URI 的格式”。

在代码隐藏中,我尝试这样做:

private void someFunc()
{
    bar.Source = new Uri("pack://application:,,,/foofiles/page1.foo");
}

它没有抛出异常,但我的主窗口崩溃了。

在我看来,如果我将任何类型的文件添加到我的项目中,并且如果我在“构建操作”中将其标记为“资源”,我应该能够根据上面的示例使用该文件。另外,我想像这样使用该文件:

private void someOtherFunc()
{
    System.IO.StreamReader reader = new System.IO.StreamReader("/foofiles/page1.foo");
    string bar = reader.ReadToEnd();
}

如有任何帮助,我们将不胜感激...提前致谢!

最佳答案

尝试像这样将组件部分添加到您的 Pack URI

pack://application:,,,/AssemblyName;component/ResourceName

其中 AssemblyName 是程序集的名称。因此,对于您的情况,以下语句应该有效:

bar.Source = new Uri("pack://application:,,,/AssemblyName;component/foofiles/page1.foo");

更实际地,尝试相对包 uri 表示法:

bar.Source = new Uri("AssemblyName;component/foofiles/page1.foo", UriKind.Relative)); 

流式阅读资源使用

var streamResourceInfo = Application.GetResourceStream(uri);
using (var stream = streamResourceInfo.Stream)
{
   // do fancy stuff with stream
}

关于c# - 访问 C# WPF 应用程序中的资源(同一程序集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257250/

相关文章:

c# - 如何将 groupBox 的角更改为尖角而不是圆形 C# .NET WPF

c# - 滚动时弹出窗口不关闭

c# - 如果第二次调用,则重置线程计时器

c# - 如何让网络浏览器忽略 cookie

WPF 删除列表框底部的额外空间

wpf - 如何使用文本 block 在 xaml 网格上设置可滚动条

wpf - 更新 wpf 数据网格的 SelectedeRow 值的 GUI

c# - MSChart Y 轴和 X 轴标签

c# attribute over main 属性

c# - 日历绑定(bind) SelectedDate 和 DisplayDate : gray dates