我做的是将不得不由我们的编译系统烙在多种皮肤WPF应用程序。理想情况下,我们希望应用程序来列出关闭可用的皮肤像一些构建将具有一对多的皮肤。

在运行时是有办法枚举所有资源字典中的特定文件夹?

我要避免用力在我隐藏编码XAML文件名,因为这是一个不断变化的情况。

有帮助吗?

解决方案

排序的。

可以枚举所有BAML(编译XAML)文件如下所示:

  var resourcesName = assembly.GetName().Name + ".g";
  var manager = new System.Resources.ResourceManager(resourcesName, assembly);
  var resourceSet = manager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
  var allXamlFiles =
    from entry in resourceSet.OfType<DictionaryEntry>()
    let fileName = (string)entry.Key
    where fileName.EndsWith(".baml")
    select fileName.Substring(0, fileName.Length-5) + ".xaml";

有没有办法知道这些的有ResourceDictionaries和其他XAML如Windows或用户控件,而无需实际加载它们。所以回答你的问题直接是“不”,除非你加载每个你发现,以检查它是否是一个资源字典XAML。这将是很慢的。

在另一方面,如果你愿意使用一个命名方案,ResourceDictionaries,那么你可以列举所有BAMLs在组装和选择符合你的为准命名方案,并相信他们是ResourceDictionaries。只是延长“其中”条款在上面的查询。

因此,答案是 “之类的”。

其他提示

这里是一个解决方案,我发现@微软

WPF包裹在“Assembly.g.resources”的ResourceDictionary,我们可以通过GetManifestResourceNames()获取资源名称“Assembly.g.resources”。之后,我们可以使用ResourceReader类从ResourceStream读取资源。

 foreach (string str in Application.ResourceAssembly.GetManifestResourceNames()){
txt.Text += str + "\n";
 {
  Stream st = Application.ResourceAssembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    txt.Text +="\t: "+ resourceEntry.Key + "\n";
   }
  }
 }
}

第二应答

可以使用Assembly.Load()加载外部组件,并从它读取资源字典。

Assembly assembly = Assembly.Load("Assembly Name String"); 
foreach (string str in assembly.GetManifestResourceNames())
{
 {
  Stream st = assembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    .....
   }
  }
 }
}

可以在运行时添加的ResourceDictionary。

Resources.MergedDictionaries.Add(...)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top