【问题标题】:How does use XamlReader to load from a Xaml file from within the assembly?如何使用 XamlReader 从程序集中的 Xaml 文件加载?
【发布时间】:2014-07-07 22:02:31
【问题描述】:

我在 stackoverflow 和互联网的其他地方发现了几篇关于如何从静态文件加载 Xaml 的帖子:他们建议创建一个 XmlReader 或 StreamReader 指向在文件系统上找到的文件,但 .xaml 文档我想要读取的内容将与程序集的其余部分一起编译,因此它不会有一个有意义的文件 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);
}

如果答案很明显,我提前道歉。

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    在您可以从程序集中将 Xaml 作为嵌入式资源加载之前,您必须进行一些设置。我将引导您完成一个示例,然后您可以根据需要对其进行自定义。

    1. 在您的项目中创建文件夹。将其命名为 XAML。
    2. 将 XAML 文件添加到 XAML 文件夹。让我们称之为 Sample.xaml。
    3. 右键单击 Sample.Xaml 并选择属性。将 Build Action 的值设置为“Embedded Resource”。
    4. 右键单击项目并选择属性。记下默认命名空间值。我们将使用它作为路径的一部分。对于此示例,假设它是“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);
    }
    

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

    【讨论】:

    • 非常感谢 - 在对嵌入式资源进行了一些额外的阅读之后,这似乎是微软认可的做法,并且最适合我的需求。
    • 要获取资源的名称,请在某处放置一个断点,然后将其粘贴到即时窗口中:System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多