2012-02-20 3 views
1

Я читал об этом какое-то время, но я не могу найти ответ, который может мне помочь, поэтому я надеюсь, что мне повезет больше.StaticResource Поиск не работает с объединенными словарями

В моем проекте у меня есть библиотека, которая содержит множество стилей для элементов управления. Эти стили используют ресурсы как статические ресурсы. Таким образом, "дерево ресурсов" в основном выглядит следующим образом:

  • Theme.xaml
    • SizeResources.xaml
    • ColorResources.xaml
    • ControlStyles.xaml
      • Control1.xaml
      • Control2 .xaml

Тема.xaml объединяет SizeResources, ColorResources и ControlStyles. ControlStyles объединяют все xamls для определенных элементов управления.

Теперь в моем приложении я хотел бы применить эту тему, поэтому OnStartup добавляю Theme.xaml в свой Application.Current.Resources.MergedDictionaries. Что отлично работает, все ключи есть. Когда я пытаюсь использовать элементы управления, я получаю исключение, которое, например, не может найти размер или цветной ресурс. Конкретный пример:

У меня есть специальная кнопка, которая имеет цвет фона, определенный в ColorResources, мой ButtonStyle использует этот ресурс как статический ресурс. Когда я использую эту кнопку в своем проекте приложения, я получаю исключение, что фоновый ресурс не найден. Когда я меняю статический ресурс на динамический ресурс в control1.xaml, тогда он работает.

Любые идеи, почему я не могу сделать это со статическим ресурсом? По моему мнению, статичность также должна работать.

ответ

2

При попытке определить:

<Rectangle Fill="{StaticResource SpecialBackgroundBrush}"/> 

вместо вашего Button, это работает? Я подозреваю, что так будет. Предполагая, что это так, вам нужно сделать то, что сам стиль Button имеет статический доступ к кистям. Таким образом, в вашем Button.xaml вам нужно что-то вроде:

<ResourceDictionary ...> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="ColorResources"/> 
    </ResourceDictionary.MergedDictionaries> 

    <Style TargetType="Button"> 
     ... 
    </Style> 
</ResourceDictionary> 

Было бы полезно, чтобы увидеть примеры ваших XAML, если это не поможет.

+0

Эй, вы действительно предоставили очень хороший пример. Мой Xaml выглядит примерно так же, как и приведенный вами пример.Поэтому в основном мой вопрос: зачем мне объединять ColorResources в файл, который содержит мой стиль Button, когда я объединяю ColorResources, а также ресурс Button на уровне приложения в один объединенный словарь. Application.Resources.MergedDictionaries.add (Theme.xaml) Чтобы использовать мой пример выше. Theme.xaml предоставляет цветные ресурсы, почему я должен объединить их в кнопку xaml? – m00ni

+0

Потому что это не статически доступный, по крайней мере, не с точки зрения компилятора XAML, который компилирует ресурсы кнопки отдельно от чего-либо еще. Он должен разрешать любые статические ресурсы, на которые ссылается кнопка, просто просматривая словарь ресурсов Button, а не на уровне вашего приложения. –

+0

Итак, компилятор в основном начинается с листьев дерева словаря ресурсов и начинает компиляцию вверх. Поэтому, если я включу свой Colors.xaml внутри кнопки, Colors.xaml будет скомпилирован без проблем, а затем в строке будет сам словарь Button, который ссылается на цвета. Он может быть скомпилирован без проблем, потому что все цвета были скомпилированы и доступны для него. Если я не совмещаю цвета внутри Button, словарь Button компилируется без ресурсов, так как все ресурсы, которые объединены в дерево дальше, недоступны во время компиляции? – m00ni

0

Даже у динамических ресурсов этот недостаток не найден в соседних объединенных словарях. Но настоящая проблема здесь заключается в скининге. Что делать, если вы хотите только изменить цвета, но не шаблоны управления, которые в свою очередь зависят от этих цветов?

Можно выделить цвета и шаблоны в два файла XAML, но в каком файле «Цвет» XAML должен быть включен файл шаблонов, если у вас есть несколько из этих файлов цветов (по одному на скин)?

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