如何使用XamlReader从程序集中加载Xaml文件?

Mic*_*der 0 .net c# wpf xaml

我发现对面计算器几个职位和互联网的关于如何从一个静态文件加载XAML中休息:他们建议创建一个的XmlReader或StreamReader的指向文件系统上发现了一个文件,但该文件名为.xaml我想read from将与程序集的其余部分一起编译,因此它不会有一个有意义的文件Uri.我不想将这个文档复制到程序集的任何地方.有没有办法从已编译到程序集中的.xaml文档中读取?

我也知道,我可以简单地从一个很长的字符串代码本身里面的文字阅读,但我宁愿没有这样做 - 从XAML中产生的UIElement应该很容易编辑,我通过在XAML文件进行编辑获得这一.

为了说明我所希望的,这是一个例子:

private void LoadUIElementFromCompiledXaml()
{
    XmlReader xmlReader = new XmlReader("*Uri for .xaml document within my assembly*");
    UIElement elementLoaded = (UIElement)XamlReader.Load(xmlReader);
}
Run Code Online (Sandbox Code Playgroud)

如果答案显而易见,我会提前道歉.

Mik*_*son 6

在将Xaml作为嵌入式资源从程序集加载之前,必须进行一些设置.我将向您介绍一个示例,然后从那里您可以自定义它以满足您的需求.

  1. 在项目中创建文件夹.将其命名为XAML.
  2. 将XAML文件添加到XAML文件夹.让我们称之为Sample.xaml.
  3. 右键单击Sample.Xaml并选择属性.将Build Action的值设置为"Embedded Resource".
  4. 右键单击项目并选择属性.记下Default命名空间值.我们将使用它作为路径的一部分.对于此示例,我们假设它是"MyNamespace".

您加载Xaml资源的代码如下所示:

string defaultNamespace = "MyNamespace";
string folderName = "XAML";
string fileName = "Sample.xaml";

string path = String.Format("{0}.{1}.{2}", defaultNamespace, folderName, fileName);

using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(path))        
{
    object root = XamlReader.Load(stream);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,资源的路径由项目的默认命名空间,文件的文件夹路径和文件名组成.如果文件夹路径有多个级别,请使用点作为文件夹分隔符代替反斜杠.例如,Xaml\Subfolder将是Xaml.Subfolder.