2016-01-21 2 views
1

У меня есть ResourceDictionary, полный PathGeometry для моих значков, возможно ли, что я могу дать этому ресурсовому слову имя, чтобы я мог использовать некоторые C# для просмотра всех моих значков и просто для того, чтобы сделать что-то более сгруппированы вместе?WPF: Дайте ресурсДля словаря

Так что я хотел бы использовать один из PathGeometry как так, например

App.Current.Resources.Icons["refresh1"] as Geometry 

or 

App.Current.Resources["Icons"]["refresh1"] as Geometry 

В настоящее время я использую App.Current.Resources["refresh1"] as Geometry использовать один из PathGeometry годов.

Редактировать: Непонятно, почему это, ну, неясно. Плакат внизу понял вопрос, но неясно, в чем причина этого. Однако моя причина не требуется, я просто хочу получить ответ на то, что я прошу, а не дискуссия о том, почему я хочу это делать.

+1

мутноватый, что вы просите. В чем смысл изменения кода, так что вам нужно писать _more_ C#, чтобы получить доступ к вашему ресурсу? То есть если вы обычно пишете 'App.Current.Resources [" refresh1 "]', почему вы хотите, чтобы потребовалось произвольное требование добавления '.Icons' или' ['Icons "]' к этому? Конечно, вы, конечно, можете иметь именованный ресурсный словарь, но не как часть свойства _existing_ 'Resources' (хотя это может быть сам ресурс с именем в качестве его ключа). Что вы на самом деле пытаетесь сделать здесь? –

+0

@PeterDuniho, я хочу, чтобы значки были под их собственной категорией, я знаю, что он пишет больше, но я просто предпочитаю группировать вещи. И я также хочу прокрутить эту категорию, чтобы отобразить все значки. –

+0

Тогда не помещайте их в один и тот же 'ResourceDictionary' со всем остальным. Либо объявляйте «ResourceDictionary» как элемент внутри коллекции «Ресурсы» какого-либо объекта (т. Е. Точно так же, как и любой другой объект, к которому вы хотите получить доступ через «Ресурсы»), или просто объявите его в кодировке.Эти стратегии очевидны, поэтому ваш вопрос неясен; так как очевидные стратегии очевидны, я полагаю, что они не работают для вас, но ваш вопрос не позволяет объяснить, почему это было бы или какая другая стратегия будет считаться полезной вам. –

ответ

1

Это один из тех очень простых вопросов, на которые люди будут больше спорить, чем отвечать! :) Люди могут рассуждать о его достоинстве столько, сколько захотят, но как только вы начинаете делать такие вещи, как динамическая загрузка 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> 

Результат:

enter image description here

Если вы хотите для доступа к ресурсам в коде, тогда вам нужно бросить первый поиск массива в 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"]; 
+0

Спасибо. Основная цель этого, чтобы быть честным, заключается в том, что я могу сгенерировать список PathGeometry в моем ResourceDictionary, чтобы затем заполнить ListView этим списком, в основном, чтобы помочь мне иметь графическое представление PathGeometry и его имя для использования на протяжении всего развитие. –

Смежные вопросы