フォルダ内のWPFのリソースディクショナリを検索し、一覧表示
-
21-09-2019 - |
質問
私は、私たちのビルドシステムによってでブランドの複数のスキンを持っているとしているWPFアプリケーションを作ってるんです。いくつかは、多くのスキンに1を持つことになります構築するとして理想的には私たちが利用できるスキンオフリストへの応用をしたいと思います。
実行時には、特定のフォルダ内のすべてのリソース辞書を列挙する方法はありますか?
私は、これが変化するような状況であるように、ハード私の分離コードで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であり、実際にそれらをロードしないように、Windowsやユーザーコントロールなどの他のXAMLであるかを知る方法はありません。あなたは、各XAMLをロードしない限り、あなたの直接的な質問への答えは、あなたがそれがResourceDictionaryのであるかどうかを確認するために見つける「ノー」です。これは非常に遅くなります。
一方、あなたしている、あなたは彼らが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(...)