4

(在我进入细节之前,我想设置上下文:我正在尝试加载一个 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();
}

任何帮助将不胜感激...在此先感谢!

4

1 回答 1

8

尝试像这样将component -part 添加到您的 Pack URI

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

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

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

更实际地,尝试相对 pack 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
}
于 2013-08-15T17:02:33.993 回答