【问题标题】:Any way to get a list of templates in a folder programatically? [duplicate]有什么方法可以以编程方式获取文件夹中的模板列表? [复制]
【发布时间】:2020-08-12 11:18:54
【问题描述】:

我知道我能做到

Uri uri = new Uri("/Templates/MyTemplate.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);

在运行时从项目中获取特定模板,但是如何列出该文件夹中可用的模板?理想情况下,我希望启动过程只需在该文件夹中添加任何内容,而不必在 App.xaml 中专门引用它们,并且每次有人更改它时都有合并冲突的风险。

GetManifestResourceNames 似乎返回了完全不同的东西。

我很想创建一个预构建过程,该过程会生成一个资源字典,枚举该文件夹中的所有内容,但这似乎很麻烦。

【问题讨论】:

  • GetManifestResourceNames() 返回什么作用?此外,AFAIK,文件夹并不是一个真正的概念,它一直是字符串,您必须手动解析名称并检查它们是否以您想要的文件夹字符串开头。
  • 它返回一个不是我想要的资源,AFAIK。
  • @KlausGütter:完美,谢谢 :)

标签: c# wpf


【解决方案1】:

您可以通过 xamlreader.load 将所有 xaml 文件读入资源字典对象并将它们合并到 application.current.resources 中。这是您的应用 xaml 合并到的位置。

在 app.xaml 中没有引用。

        string folder = System.Environment.CurrentDirectory;
        string[] files = Directory.GetFiles(folder, "*.xaml", SearchOption.TopDirectoryOnly);
        foreach (var f in files)
        {
            StreamReader sr = new StreamReader(f);
            ResourceDictionary rd = XamlReader.Load(sr.BaseStream) as ResourceDictionary;
            Application.Current.Resources.MergedDictionaries.Add(rd);
        }

我对当前目录的选择并不十分小心,当然您可能希望将资源字典放在其他地方。

如果您在资源字典中的任何内容上都有 x:Shared,则此方法会出错。它告诉您必须编译资源字典。学术,如果你不使用它。

万一您的 exe 旁边有一些其他 .xaml 文件,您可以在资源字典名称中添加“rd”。或者将它们制作成 .txt 文件。

【讨论】:

  • 只有将 xaml 文件复制到输出目录时才会起作用,但事实并非如此。
  • 您写道“理想情况下,我希望启动过程只需在该文件夹中添加任何内容”。用任何“那个文件夹”替换输出目录。
  • 我的意思是项目中的一个文件夹——它不等同于输出目录中的一个文件夹。
  • 使其等同于输出目录中的文件夹。制作这些 txt 文件并将它们的属性设置为内容,如果更新,则复制到输出目录。或使用服务下载。如果这些是您项目中的文件夹,为什么不直接将它们合并到 app.xaml 中?
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2012-05-14
  • 1970-01-01
  • 2012-06-14
  • 2014-02-28
  • 2010-12-25
相关资源
最近更新 更多