WPF: ссылки ресурсов из темы [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
408
задан brian d foy 14 October 2008 в 13:06
поделиться

12 ответов

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

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

406
ответ дан Matt 27 August 2018 в 14:05
поделиться
  • 1
    Что нужно изменить, прежде чем мне понадобится использовать DynamicResource? Возьмите шаблон, например: я определяю его один раз, но тогда, конечно, триггеры и прочее могут изменять содержимое шаблона, но шаблон все тот же. Будет ли StaticResource здесь? – Isak Savo 14 October 2008 в 13:21
  • 2
    Используйте StaticResource, если ресурс, с которым вы подключаетесь, определен в XAML до его использования и не изменится на время работы приложения. В этом случае вы получаете лучшую производительность с помощью StaticResource. – Phil Wright 14 October 2008 в 13:24
  • 3
    это двухсвязывание, применимое к обоим из них, если да, то какая разница в этом случае? – WhoIsNinja 29 December 2010 в 23:24
  • 4
    Последнее предложение действительно важно: It will update the target if the source resource dictionary is changed. – MEMark 16 December 2013 в 19:51
  • 5
    @IsakSavo Рассмотрим пользовательский интерфейс с цветными темами. С динамическим ресурсом вы можете поменять один словарь на другой, и все ссылки на ресурсы в новом словаре будут обновляться автоматически. – Gusdor 20 January 2015 в 14:25

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

28
ответ дан Afshin 27 August 2018 в 14:05
поделиться

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

2
ответ дан BIBIN K ONANKUNJU 27 August 2018 в 14:05
поделиться

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

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

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

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

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

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

13
ответ дан CharithJ 27 August 2018 в 14:05
поделиться

Я тоже был смущен. См. Этот пример ниже:

<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
  • И это слишком «до» они используются ,

Надеюсь, я немного смутил.

105
ответ дан Gennady Vanin Геннадий Ванин 27 August 2018 в 14:05
поделиться

Ниже приведены основные различия между статическими и динамическими ресурсами:

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

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

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

2
ответ дан Gul Md Ershad 27 August 2018 в 14:05
поделиться

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

0
ответ дан Inga 27 August 2018 в 14:05
поделиться
  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 как розовую, если она отображает сетку.

StaticResource [/g0] StaticResource

DynamicResource [/g1] DynamicResource

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

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

18
ответ дан Jeson Martajaya 27 August 2018 в 14:05
поделиться

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

25
ответ дан lasitha edirisooriya 27 August 2018 в 14:05
поделиться
  • 1
    Объяснение в источнике отличное, но копирование вставки, особенно без ссылки на него оригинальным автоответчиком (оно было добавлено редактированием @ Em1), является BAD. Итак, ответ отличный, но он не может быть даже отменен – Gennady Vanin Геннадий Ванин 22 April 2013 в 04:34
  • 2
    Просто чтобы подтвердить. Я видел «проблему производительности». везде, это проблема производительности каждый раз, когда элемент загружен, правильно? Или это вопрос о перфермансе только один раз (когда приложение запускается)? – Morgane 25 May 2015 в 23:04

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

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

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

7
ответ дан Manish Basantani 27 August 2018 в 14:05
поделиться

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

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

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

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

  1. Значение свойства или стиля. неизвестно до выполнения. Это включает в себя параметры системы, приложения, темы, основанные на настройке. Это также включает в себя прямые ссылки.
  2. Ссылка на большие ресурсы, которые могут не загружаться при загрузке страницы, окон, пользовательских загрузок.
  3. Ссылка на стили темы в настраиваемом элементе управления.
1
ответ дан Wolfgang 27 August 2018 в 14:05
поделиться

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

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

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

3
ответ дан zamoldar 27 August 2018 в 14:05
поделиться
  • 1
    Для DynamicResources возникает ли проблема с производительностью только один раз (используется в первый раз) или каждый раз, когда используется этот элемент? – Morgane 25 May 2015 в 23:09
  • 2
    в этом случае большинство используемых полей должны быть статическим ресурсом, пользовательские поля могут быть динамическими, то есть для ресурсов mainwindow статические и ресурс диалогового окна могут быть динамическими – zamoldar 3 July 2017 в 22:58
Другие вопросы по тегам:

Похожие вопросы: