В чем разница между StaticResource и DynamicResource в WPF? - PullRequest
439 голосов
/ 14 октября 2008

При использовании таких ресурсов, как кисти, шаблоны и стили в WPF, они могут быть указаны как StaticResources

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

или как DynamicResource

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

В большинстве случаев (всегда?) Работает только одна, а другая вызывает исключение во время выполнения. Но я хотел бы знать, почему:

  • В чем главное отличие. Как память или производительность влияет
  • Существуют ли в WPF такие правила, как "кисти всегда статичны", "шаблоны всегда динамичны" и т. Д .?

I Предположим, выбор между Static vs Dynamic не так произвольн, как кажется ... но мне не удается увидеть шаблон.

Ответы [ 9 ]

432 голосов
/ 14 октября 2008

A StaticResource будет разрешен и назначен свойству во время загрузки XAML, которая происходит до фактического запуска приложения. Он будет назначен только один раз, а любые изменения в словаре ресурсов будут игнорироваться.

A DynamicResource назначает объект Expression свойству во время загрузки, но фактически не ищет ресурс до времени выполнения, когда объект Expression запрашивает значение. Это откладывает поиск ресурса, пока он не понадобится во время выполнения. Хорошим примером может служить прямая ссылка на ресурс, определенный позже в XAML. Другим примером является ресурс, который даже не будет существовать до времени выполнения. Он обновит цель, если будет изменен словарь исходного ресурса.

113 голосов
/ 30 декабря 2010

Я был также смущен о них. Смотрите этот пример ниже:

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

Здесь я использовал динамический ресурс для кнопки и окна и нигде не объявил его. Во время выполнения будет проверен ResourceDictionary иерархии. Так как я не определил его, я думаю, будет использоваться значение по умолчанию.

Если я добавлю приведенный ниже код для события нажатия кнопки, поскольку они используют DynamicResource, фон будет соответствующим образом обновлен.

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

Если бы они использовали StaticResource:

  • Ресурс должен быть объявлен в XAML
  • И это тоже "до" они используются.

Надеюсь, я прояснил некоторую путаницу.

30 голосов
/ 26 декабря 2010

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

27 голосов
/ 09 ноября 2012

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

<Window.Resources>
    <RadialGradientBrush x:Key="myGradientBrush">
        <GradientStop Color="Green" Offset="0"/>
        <GradientStop Color="Blue" Offset="2"/>
    </RadialGradientBrush>
</Window.Resources>

Теперь вышеуказанный ресурс может использоваться как статический или динамический ресурс. Следует помнить, что при использовании статических ресурсов его следует сначала определить в коде XAML, прежде чем ссылаться на него. Статические и Динамические ресурсы могут использоваться как:

<Grid Background="{StaticResource myGradientBrush}"></Grid>

или

<Grid Background="{DynamicResource myGradientBrush}"></Grid>

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

Проще говоря, если свойство цвета RadialGradientBrush изменено в коде на Orange и Pink, то оно будет отражаться на элементах только тогда, когда ресурс используется в качестве DynamicResource. Ниже приведен код для изменения ресурса в коде:

RadialGradientBrush radialGradientBrush =
    new RadialGradientBrush(Colors.Orange, Colors.Pink);
this.Resources["myGradientBrush"] = radialGradientBrush;

Недостаток DynamicResource заключается в том, что он снижает производительность приложений, поскольку ресурсы извлекаются при каждом их использовании. Рекомендуется использовать StaticResource до тех пор, пока не появится конкретная причина для использования DynamicResource.

Источник:
WPF: StaticResource и DynamicResource

19 голосов
/ 27 апреля 2015
  1. StaticResource использует первое значение. DynamicResource использует последнее значение.
  2. DynamicResource может использоваться для вложенных стилей, StaticResource не может.

Предположим, у вас есть этот словарь стилей. LightGreen находится на корневом уровне, в то время как Pink находится внутри сетки.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Grid}">
        <Style.Resources>
            <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
                <Setter Property="Background" Value="Pink"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
        <Setter Property="Background" Value="LightGreen"/>
    </Style>
</ResourceDictionary>

В поле зрения:

<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ConflictingStyleWindow" Height="100" Width="100">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Style="{DynamicResource ConflictButton}" Content="Test"/>
    </Grid>
</Window>

StaticResource отобразит кнопку как LightGreen, первое найденное значение в стиле. DynamicResource переопределит кнопку LightGreen в розовом цвете при визуализации сетки.

StaticResource StaticResource

DynamicResource DynamicResource

Имейте в виду, что VS Designer рассматривает DynamicResource как StaticResource. Это получит первое значение. В этом случае VS Designer будет отображать кнопку как LightGreen, хотя на самом деле она выглядит как Pink.

StaticResource выдаст ошибку при удалении стиля корневого уровня (LightGreen).

13 голосов
/ 30 марта 2013

В чем главное отличие. Как память или производительность влияет

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

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

Недостатком динамических ресурсов является то, что они имеют тенденцию снижать производительность приложений.

Есть ли в WPF такие правила, как "кисти всегда статичны" и "шаблоны всегда динамичны" и т. Д .?

Лучше всего использовать статические ресурсы, если нет особой причины, например, если вы хотите динамически изменять ресурс в коде. Другой пример, в котором вы хотите использовать динамические ресурсы, включает использование SystemBrushes, SystenFonts и System Parameters.

7 голосов
/ 24 января 2014

Нашли все ответы полезными, просто хотели добавить еще один вариант использования.

В составном сценарии WPF ваш пользовательский элемент управления может использовать ресурсы, определенные в любом другом родительском окне / элементе управления (в котором будет размещен этот пользовательский элемент управления), ссылаясь на этот ресурс как DynamicResource.

Как уже упоминалось, Staticresource будет проверен во время компиляции. Пользовательские элементы управления не могут ссылаться на те ресурсы, которые определены в хостинге / родительском элементе управления. Тем не менее, в этом случае можно использовать DynamicResource.

3 голосов
/ 18 сентября 2014

Важное преимущество динамических ресурсов

если запуск приложения занимает очень много времени, вы должны использовать динамические ресурсы, потому что статические ресурсы всегда загружаются при создании окна или приложения, а динамические ресурсы загружаются при первом использовании.

Однако вы не увидите никакой выгоды, если ваш ресурс не очень большой и комплекс.

1 голос
/ 01 сентября 2016

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

Статические ресурсы используются при следующих обстоятельствах:

  1. Когда изменение ресурса реакции во время выполнения не требуется.
  2. Если вам нужна хорошая производительность с большим количеством ресурсов.
  3. При ссылке на ресурсы в одном словаре.

Динамические ресурсы:

  1. Значение свойства или темы установки стиля не известно до времени выполнения
    • Сюда входят настройки системы, приложения, темы
    • Сюда также входят прямые ссылки.
  2. Ссылка на большие ресурсы, которые могут не загружаться при загрузке страницы, окон, пользовательских элементов управления.
  3. Ссылка на стили темы в пользовательском элементе управления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...