2016-04-15 49 views
3

是否可以枚举组件中定义的所有XAML资源?我知道如何获取一个资源,如果你有它的密钥可用,但在我的情况并非如此。编辑: 似乎我不够清楚。我想列出在我知道完整路径的大会外部大会中定义的XAML资源。如何获取组件中定义的XAML资源列表?

+0

你想要所有的资源,无论它们是在app/window/usercontrol/style中定义的吗? – Nitin

+0

我只需要外部可用的资源。我不认为你可以使用另一个程序集的UserControl/Window中定义的资源,对吧? – ionoy

回答

5

是的,你可以通过循环迭代资源。例如,使用foreach循环:

foreach (var res in Application.Current.Resources) 
{ 
    Console.WriteLine(res); 
} 

更新:

从外部库得到所有ResourceDictionary'ies,你应该在第一,加载库,然后得到ManifestResourceInfo。让我给个例子:

string address = @"WpfCustomControlLibrary.dll"; 
List<Stream> bamlStreams = new List<Stream>(); 
Assembly skinAssembly = Assembly.LoadFrom(address);    
string[] resourceDictionaries = skinAssembly.GetManifestResourceNames(); 
foreach (string resourceName in resourceDictionaries) 
{ 
    ManifestResourceInfo info = skinAssembly.GetManifestResourceInfo(resourceName); 
    if (info.ResourceLocation != ResourceLocation.ContainedInAnotherAssembly) 
    { 
     Stream resourceStream = skinAssembly.GetManifestResourceStream(resourceName); 
     using (ResourceReader reader = new ResourceReader(resourceStream)) 
     { 
     foreach (DictionaryEntry entry in reader) 
     { 
      //Here you can see all your ResourceDictionaries 
      //entry is your ResourceDictionary from assembly 
      } 
     } 
    } 
} 

你可以看到所有你ResourceDictionary的在reader。请参阅上面的代码。

我测试过这段代码,它工作。

+0

对不起,好像我不清楚我的问题。我想列出当前未加载到AppDomain中的外部程序集中的资源。 – ionoy

+0

不幸的是,我不认为它会列出在XAML中定义的资源。 – ionoy

+0

@ionoy请看我更新的答案。我已经测试了这个代码,它的工作原理。 – StepUp

4

试试下面的代码:

 ResourceDictionary dictionary = new ResourceDictionary(); 
     dictionary.Source = new Uri("pack://application:,,,/WpfControlAssembly;Component/RD1.xaml", UriKind.Absolute); 
     foreach (var item in dictionary.Values) 
     { 
      //Operations 
     } 

这里WpfControlAssembly是您的程序集的名称。 Component是固定值,然后RD1.xamlResource Dictionary

下面是输出:

资源字典

Resource Dictionary

代码输出:

Output

PS:全部ResourceDictionary文件应该有Build Action作为'Resource''Page'

更新:

最后我能做到这一点。请使用以下方法:

public ResourceDictionary GetResourceDictionary(string assemblyName) 
    { 
     Assembly asm = Assembly.LoadFrom(assemblyName); 
     Stream stream = asm.GetManifestResourceStream(asm.GetName().Name + ".g.resources");    
     using (ResourceReader reader = new ResourceReader(stream)) 
     { 
      foreach (DictionaryEntry entry in reader) 
      { 
       var readStream = entry.Value as Stream; 
       Baml2006Reader bamlReader = new Baml2006Reader(readStream); 
       var loadedObject = System.Windows.Markup.XamlReader.Load(bamlReader); 
       if (loadedObject is ResourceDictionary) 
       { 
        return loadedObject as ResourceDictionary; 
       } 
      } 
     } 
     return null; 
    } 

OUTPUT:

RD

没有预期Exceptions任何的try-catch &,我认为更多的WPF(而不是将一切到ResourceDictionary)的方式。

+0

但是如果我不知道ResourceDictionary(RD1.xaml)的名称会怎么样?是否有可能在程序集中找到所有ResourceDictionaries的名称? – ionoy

+1

如果您不知道ResourceDictionaries的名称,可以从AssamblyInfo获得该名称,但是如果您不知道名称,您将如何找到它们中的资源。我的意思是如果你不知道。资源词典的名字,但知道它们的资源名称似乎对我来说很讽刺。我不确定你想在这里实现什么。 –

+0

@ionoy你对这个大会有什么细节? –

相关问题