質問

私は、私たちのビルドシステムによってでブランドの複数のスキンを持っているとしている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(...)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top