アセンブリで定義されているすべてのXAMLリソースを列挙できますか?私はリソースを取得する方法を知っていますが、利用可能な場合はそれが私の状況ではありません。アセンブリで定義されたXAMLリソースの一覧を取得する方法は?
編集: 私は十分にはっきりしていないようです。私は外部アセンブリで定義されたXAMLリソースをリストしたいと思います。
アセンブリで定義されているすべてのXAMLリソースを列挙できますか?私はリソースを取得する方法を知っていますが、利用可能な場合はそれが私の状況ではありません。アセンブリで定義されたXAMLリソースの一覧を取得する方法は?
編集: 私は十分にはっきりしていないようです。私は外部アセンブリで定義されたXAMLリソースをリストしたいと思います。
はい、ループを通してリソースを反復できます。例えば、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
年代を見ることができます。上記のコードを見てください。
私はこのコードをテストして動作します。コードの下
試してみてください。ここでは
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.xaml
はResource Dictionary
です。以下は
リソース辞書
コード出力:
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:
どんなのtry-catchがないと&は
Exceptions
を期待し、私は(代わりに変換するすべてのより多くのWPFで考えます〜ResourceDictionary
)へ。
しかし、ResourceDictionary(RD1.xaml)の名前がわからない場合はどうしたらいいですか?アセンブリ内のすべてのResourceDictionariesの名前を見つけることは可能ですか? – ionoy
ResourceDictionariesの名前がわからない場合は、AssamblyInfoから取得できますが、名前が分からない場合はどのようにしてリソースを検索しますか?私はあなたが.ResourceDictionariesの名前を知らないが、その中のリソースの名前がわたしに皮肉っていることを知っているならば。私はここで何を達成したいのか分かりません。 –
@ionoyこのアセンブリについての詳細は? –
app/window/usercontrol/styleに定義されているすべてのリソースが必要ですか? – Nitin
私は外部から利用できるリソースが必要です。別のアセンブリのUserControl/Windowで定義されたリソースを使用できるとは思いませんか? – ionoy