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

时间:2013-08-15 16:32:59

标签: c# wpf xaml visual-studio-2012

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

我创建了一个新的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();
}

任何帮助都将受到赞赏...提前感谢!

1 个答案:

答案 0 :(得分:8)

尝试将组件 -part添加到您的包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
}