7

WPF で、特定の埋め込みリソース ディレクトリ内のすべてのファイルを列挙する方法はありますか? つまり、すべて「ビルド アクション」が「リソース」に設定されているアイテムのディレクトリです。

4

1 に答える 1

15

リソースは、 という名前のリソース ストリームにコンパイルされYourAssemblyName.g.resourcesます。そのため、キーがリソース名で値がリソース データである辞書のように見えるこのストリームをロードします。リソース名は (通常) リソースの元のフォルダーとファイル名であるため、リソース名に関心があります。次に、関心のあるフォルダーで始まるキーを除外します。

public static string[] GetResourcesUnder(string folder)
{
    folder = folder.ToLower() + "/";

    var assembly       = Assembly.GetCallingAssembly();
    var resourcesName  = assembly.GetName().Name + ".g.resources";
    var stream         = assembly.GetManifestResourceStream(resourcesName);
    var resourceReader = new ResourceReader(stream);

    var resources =
        from p in resourceReader.OfType<DictionaryEntry>()
        let theme = (string)p.Key
        where theme.StartsWith(folder)
        select theme.Substring(folder.Length);

    return resources.ToArray();
}

LINQ クエリは、指定されたフォルダー名で始まるすべてのリソース キーを除外し、キーからフォルダー名も削除します。

知っておく必要があることの 1 つは、XAML ファイルがコンパイルされ、拡張子 BAML が付けられることです。Themes/Theme1.xaml、などの名前のフォルダーの下にリソース ディクショナリがたくさんあるとします。これらは、、、などThemes/Theme2.xamlとしてアセンブリにコンパイルされます。Themes/Theme1.bamlThemes/Theme2.baml

于 2011-03-03T19:22:55.763 に答える