.net - динамический - ресурсы wpf




В чем разница между StaticResource и DynamicResource в WPF? (8)

  1. StaticResource использует первое значение. DynamicResource использует последнее значение.
  2. DynamicResource может использоваться для вложенного стиля, StaticResource не может.

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

<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 как розовую, как она отображает Grid.

StaticResource

DynamicResource

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

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

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

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

или как DynamicResource

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

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

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

Я предполагаю, что выбор между Static vs Dynamic не так произволен, как кажется ... но я не вижу шаблон.


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


Логические ресурсы позволяют вам определять объекты в 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 изменяется в коде на оранжевый и розовый, тогда он будет отражать элементы только тогда, когда ресурс используется как DynamicResource. Ниже приведен код для изменения ресурса в коде:

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

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

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


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

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

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


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


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


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

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


В чем основное отличие. Подобно последствиям памяти или производительности

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

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

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

Существуют ли правила WPF, такие как «кисти всегда статичны» и «шаблоны всегда динамичны» и т. Д.?

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





resources