2016-04-15 14 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 
      } 
     } 
    } 
} 

あなたはreaderにすべてのResourceDictionary年代を見ることができます。上記のコードを見てください。

私はこのコードをテストして動作します。コードの下

+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

どんなのtry-catchがないと&はExceptionsを期待し、私は(代わりに変換するすべてのより多くのWPFで考えます〜ResourceDictionary)へ。

+0

しかし、ResourceDictionary(RD1.xaml)の名前がわからない場合はどうしたらいいですか?アセンブリ内のすべてのResourceDictionariesの名前を見つけることは可能ですか? – ionoy

+1

ResourceDictionariesの名前がわからない場合は、AssamblyInfoから取得できますが、名前が分からない場合はどのようにしてリソースを検索しますか?私はあなたが.ResourceDictionariesの名前を知らないが、その中のリソースの名前がわたしに皮肉っていることを知っているならば。私はここで何を達成したいのか分かりません。 –

+0

@ionoyこのアセンブリについての詳細は? –

関連する問題