При использовании ресурсов, таких как кисти, шаблоны и стили в WPF, они могут быть указаны как StaticResources.
<Rectangle Fill="{StaticResource MyBrush}" />
или как DynamicResource
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
В большинстве случаев (всегда?) Работает только одна, а другая вызывает исключение во время выполнения. Но я хотел бы знать, почему:
- В чем главное отличие. Как память или производительность влияет
- Есть ли в WPF такие правила, как «кисти всегда статичны», «шаблоны всегда динамичны» и т. Д.?
Я предполагаю, что выбор между Static vs Dynamic не так произвольн, как кажется ... но мне не удается увидеть шаблон.
Ответы:
StaticResource будет решен , и присваивается свойству во время загрузки XAML , которое происходит до того , как приложение реально работать. Он будет назначен только один раз, а любые изменения в словаре ресурсов будут игнорироваться.
DynamicResource присваивает объект Expression свойству во время загрузки , но не на самом деле не LookUp ресурса до времени выполнения , когда объект Expression задаются для значения. Это откладывает поиск ресурса, пока он не понадобится во время выполнения. Хорошим примером может служить прямая ссылка на ресурс, определенный позже в XAML. Другим примером является ресурс, который даже не будет существовать до времени выполнения. Это обновит цель, если исходный словарь ресурсов будет изменен.
источник
It will update the target if the source resource dictionary is changed.
Я был также смущен о них. Смотрите этот пример ниже:
Здесь я использовал динамический ресурс для кнопки и окна и нигде не объявил его. Во время выполнения будет проверен ResourceDictionary иерархии. Так как я не определил его, я думаю, будет использоваться значение по умолчанию.
Если я добавлю приведенный ниже код для события click кнопки, поскольку они используют DynamicResource, фон будет соответствующим образом обновлен.
Если бы они использовали StaticResource:
Надеюсь, я прояснил некоторую путаницу.
источник
StaticResource будет разрешен при построении объекта.
DynamicResource будет оцениваться и разрешаться каждый раз, когда ресурс нуждается в элементе управления.
источник
Предположим, у вас есть этот вложенный словарь стилей. LightGreen находится на корневом уровне, в то время как Pink вложен в Grid.
Ввиду:
StaticResource отобразит кнопку как LightGreen, первое найденное значение в стиле. DynamicResource переопределит кнопку LightGreen в розовом цвете при визуализации сетки.
StaticResource
DynamicResource
Имейте в виду, что VS Designer рассматривает DynamicResource как StaticResource. Это получит первое значение. В этом случае VS Designer будет отображать кнопку как LightGreen, хотя на самом деле она выглядит как Pink.
StaticResource выдаст ошибку при удалении стиля корневого уровня (LightGreen).
источник
В чем главное отличие. Как память или производительность влияет
Разница между статическими и динамическими ресурсами возникает при изменении базового объекта. Если ваша кисть, определенная в коллекции ресурсов, была доступна в коде и настроена на другой экземпляр объекта, Rectangle не обнаружит это изменение.
Статические ресурсы извлекаются один раз с помощью ссылки на элемент и используются в течение срока службы ресурсов. Принимая во внимание, что DynamicResources извлекают каждый раз, когда они используются.
Недостатком динамических ресурсов является то, что они имеют тенденцию снижать производительность приложений.
Есть ли в WPF такие правила, как «кисти всегда статичны», «шаблоны всегда динамичны» и т. Д.?
Лучше всего использовать статические ресурсы, если нет особой причины, например, если вы хотите динамически изменять ресурс в коде. Другой пример, в котором вы хотите использовать динамические ресурсы, включает использование SystemBrushes, SystenFonts и System Parameters.
источник
Нашел все ответы полезными, просто хотел добавить еще один вариант использования.
В составном сценарии WPF ваш пользовательский элемент управления может использовать ресурсы, определенные в любом другом родительском окне / элементе управления (который собирается разместить этот пользовательский элемент управления), ссылаясь на этот ресурс как DynamicResource.
Как уже упоминалось, Staticresource будет проверен во время компиляции. Пользовательские элементы управления не могут ссылаться на те ресурсы, которые определены в хостинге / родительском элементе управления. Тем не менее, DynamicResource может быть использован в этом случае.
источник
Важное преимущество динамических ресурсов
если запуск приложения занимает очень много времени, вы должны использовать динамические ресурсы, потому что статические ресурсы всегда загружаются при создании окна или приложения, тогда как динамические ресурсы загружаются при их первом использовании.
Тем не менее, вы не увидите никакой выгоды, если ваш ресурс не очень большой и сложный.
источник
Динамические ресурсы могут использоваться только в том случае, если устанавливаемое свойство находится на объекте, который получен из объекта зависимости или может быть заблокирован, когда статические ресурсы могут использоваться где угодно. Вы можете абстрагировать весь контроль, используя статические ресурсы.
Статические ресурсы используются при следующих обстоятельствах:
Динамические ресурсы:
источник