Это один из тех очень простых вопросов, на которые люди будут больше спорить, чем отвечать! :) Люди могут рассуждать о его достоинстве столько, сколько захотят, но как только вы начинаете делать такие вещи, как динамическая загрузка ResourceDictionaries (скажем, из внешних DLL-модулей), такие темы внезапно становятся очень актуальными!
Чтобы ответить на ваш вопрос, да, конечно, это возможно. Главное предостережение здесь в том, что если вы просто добавите ResourceDictionaries в словарь ресурсов приложений, тогда компилятор XAML будет путать вас с тем, что вы пытаетесь сделать. Хитрость здесь явно указать один верхний уровень ResourceDictionary, а затем добавить все свои ресурсы, в то числе вашего key'd ResourceDictionaries, как содержание, что:
<Application.Resources>
<ResourceDictionary xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ResourceDictionary x:Key="Dictionary1">
<sys:String x:Key="str1a">String 1A</sys:String>
<sys:String x:Key="str1b">String 1B</sys:String>
<sys:String x:Key="str1c">String 1C</sys:String>
</ResourceDictionary>
<ResourceDictionary x:Key="Dictionary2">
<sys:String x:Key="str2a">String 2A</sys:String>
<sys:String x:Key="str2b">String 2B</sys:String>
<sys:String x:Key="str2c">String 2C</sys:String>
</ResourceDictionary>
<!-- All other application resources go here -->
</ResourceDictionary>
</Application.Resources>
Вот некоторые XAML, который статический связывается с словарями показывают, что этот метод работает как задумано:
<StackPanel>
<ListBox ItemsSource="{StaticResource Dictionary1}" DisplayMemberPath="Value" />
<ListBox ItemsSource="{StaticResource Dictionary2}" DisplayMemberPath="Value" />
</StackPanel>
Результат:
Если вы хотите для доступа к ресурсам в коде, тогда вам нужно бросить первый поиск массива в ResourceDictionary, то индекс, по фактическому ключу элемента:
var str = (App.Current.Resources["Dictionary1"] as ResourceDictionary)["str1a"].ToString();
Если это слишком грязное, то вы можете очистить его с помощником класс так:
public class Global
{
static Global _global = new Global();
public static Global Dictionaries { get { return _global; } }
public ResourceDictionary this[string index]
{
get { return App.Current.Resources[index] as ResourceDictionary; }
}
}
что вы использовали бы так:
var str = (string)Global.Dictionaries["Dictionary1"]["str1a"];
мутноватый, что вы просите. В чем смысл изменения кода, так что вам нужно писать _more_ C#, чтобы получить доступ к вашему ресурсу? То есть если вы обычно пишете 'App.Current.Resources [" refresh1 "]', почему вы хотите, чтобы потребовалось произвольное требование добавления '.Icons' или' ['Icons "]' к этому? Конечно, вы, конечно, можете иметь именованный ресурсный словарь, но не как часть свойства _existing_ 'Resources' (хотя это может быть сам ресурс с именем в качестве его ключа). Что вы на самом деле пытаетесь сделать здесь? –
@PeterDuniho, я хочу, чтобы значки были под их собственной категорией, я знаю, что он пишет больше, но я просто предпочитаю группировать вещи. И я также хочу прокрутить эту категорию, чтобы отобразить все значки. –
Тогда не помещайте их в один и тот же 'ResourceDictionary' со всем остальным. Либо объявляйте «ResourceDictionary» как элемент внутри коллекции «Ресурсы» какого-либо объекта (т. Е. Точно так же, как и любой другой объект, к которому вы хотите получить доступ через «Ресурсы»), или просто объявите его в кодировке.Эти стратегии очевидны, поэтому ваш вопрос неясен; так как очевидные стратегии очевидны, я полагаю, что они не работают для вас, но ваш вопрос не позволяет объяснить, почему это было бы или какая другая стратегия будет считаться полезной вам. –