powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Resources, ResourceDictionaries
4 сообщений из 4, страница 1 из 1
WPF: Resources, ResourceDictionaries
    #39246191
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то не получается уложить в голове работу WPF со словарями ресурсов. В частности:

1) в какой момент создается экземпляр словаря ресурсов?

2) в какой момент создаются экземпляры классов, входящих в словарь?

3) почему для статического ресурса принципиально, чтобы вложенные ресурсы были определены раньше, чем их использование (как то связано с компиляцией, видимо)?

4) что получается, если я подключаю один и тот же словарь ресурсов в несколько мест (к примеру через ControlTemplate.Resources)? создается несколько экземпляров словаря со своим набором экземпляров входящих в него классов? или везде используется один экземпляр?

5) тот же вопрос, если я использую MergedDictionaries.

6) Почему не работает следующая конструкция:
Код: plaintext
файл /Resources/Brush.xaml:
Код: xml
1.
2.
3.
4.
5.
6.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <SolidColorBrush x:Key="BrownBrush" Color="Brown" />
  
</ResourceDictionary>

Код: plaintext
файл /Resources/Butt.xaml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Button x:Key="TestButton" Width="40" Height="20" Background="{StaticResource BrownBrush}">
    Test
  </Button>
  
</ResourceDictionary>

Код: plaintext
файл Themes/Generic.xaml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Resources/Brush.xaml" />
    <ResourceDictionary Source="/Resources/Butt.xaml" />
  </ResourceDictionary.MergedDictionaries>
  
</ResourceDictionary>

- то есть BrownBrush недоступен, несмотря на то, что он есть в generic раньше, чем Butt.

7) Почему предыдущий пример прекрасно работает, если MergedDictionaries перенести из generic.xaml в ресурсы окна или приложения?


В общем, тыкаюсь как слепой котенок, добиваюсь каких-то результатов, но не очень понимаю как.
...
Рейтинг: 0 / 0
WPF: Resources, ResourceDictionaries
    #39247445
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаются по первому запросу. Статические на то и статические, что не меняются после создания, cross-reference и рекурсия для них невозможны. Везде используется один экземпляр, автоматически реализуется т. с. include once. Если ресурс объявлен в другом словаре, то нужно его тоже подключить через MergedDictionaries, тогда сработает. Ресурсы приложения доступны из всего приложения, StaticResource позволяет их получить.
...
Рейтинг: 0 / 0
WPF: Resources, ResourceDictionaries
    #39247485
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81Создаются по первому запросу. Статические на то и статические, что не меняются после создания, cross-reference и рекурсия для них невозможны. Везде используется один экземпляр, автоматически реализуется т. с. include once. Если ресурс объявлен в другом словаре, то нужно его тоже подключить через MergedDictionaries, тогда сработает. Ресурсы приложения доступны из всего приложения, StaticResource позволяет их получить.

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

1) в какой момент создается экземпляр словаря ресурсов?
все Xaml ресурсы грузятся через BAML Reader, в этот момент загружаются все словари которые смержены с тем, что в данный момент загружается, первым загружается app.xaml со своими Merged словарями, в этот момент сами экземпляры объектов не создаются, только по запросу через {StaticResource}, {DynamicResource}, FindResource(), TryFindResource() или другие изощренные варианты :)
2) в словарь ресурсного файла? сам словарь формируется во время загрузки, а экземпляры по запросу
3) это совсем не обязательно, вы легко сможете в этом убедившись, зададите статический ресурс свойству, а потом во время загрузки через CodeBehind добавите ресурс, он будет работать и исключения не будет. И компиляция пройдет успешно.
6-7) в момент, когда ты указываешь через Merged 2 словаря, они не могут загрузиться, так как не являются 1 файлом ресурсов, то есть каждый будет загружается отдельно, а потом добавляться в тот, который подгружают, то есть по сути это просто инструкция, что вместе с этим файлов нужно загрузить еще другие. Подгружаемый смежный ресурс, ни чего не знает о том, какие ресурсы уже есть в существующем ресурсе и других смежных ресурсах.
А вот наследование ресурсов в визуальном дереве работает на другом этапе, не загрузки самого XAML файл, а на этапе построения визуального дерева. Когда ты загружаешь DataTemplate через ContentPresenter или набор элементов через ContentPresenter\ContentControl.

я стараюсь делать так:
у меня есть набор XAML Файлов отвечающих за стили каждого контрола, в этих xaml файлах подгружаются все необходимые ресурсы для этого (кисти, которые я связываю через {DynamicResource Static.ResourceKey}, если это системные ресурсы, то просто переопределяю их (если шаблон стандартный или использует системную палитру), Geometry, конверторы, DataTemplate'ы (для моделей представления)
Всё это находится в отдельном проекте.
Все стиливые xaml файлы я гружу в App.xaml, переопределяя их по ключу типу {x:Type Control}.
Можно еще делать всякие выкрутасы типа динамической смены темы и прочее, но задач таких не кто не ставит и я этим не страдаю :)
...
Рейтинг: 0 / 0
WPF: Resources, ResourceDictionaries
    #39247622
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesShocker.Pro 3) почему для статического ресурса принципиально, чтобы вложенные ресурсы были определены раньше, чем их использование (как то связано с компиляцией, видимо)?3) это совсем не обязательно, вы легко сможете в этом убедившись, зададите статический ресурс свойству, а потом во время загрузки через CodeBehind добавите ресурс, он будет работать и исключения не будет. И компиляция пройдет успешно.я имею ввиду, что вот такое:
Код: xml
1.
2.
3.
4.
  <Border Background="{StaticResource BrownBrush}" />
  <Window.Resources>
    <SolidColorBrush x:Key="BrownBrush" Color="Brown" />
  </Window.Resources>

не работает, статический ресурс должен быть объявлен до использования. Объяснение "BAML-ридер читает файл рекурсивно и последовательно, стало быть на момент создания Border-а словарь Window.Resources уже должен что-то содержать" не очень объясняет, почему работает динамический ресурс. Динамический ищется в словаре каждый раз при очередном использовании, но для первоначальной инициализации словарь один фиг должен уже существовать...

Или тут при чтении динамического ресурса, объявленного позже, таки возникает ошибка поиска ресурса, но мы ее не видим, пока идет чтение BAML-а, а потом при дальнейшем чтении, при появлении словаря и нужного ресурса в нем, он переоценивается еще раз и ошибка поиска ресурса уже исчезает?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Resources, ResourceDictionaries
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]