Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена в нуль (т. е. она не ссылалась на экземпляр фактического объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для 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
}
A StaticResource будет разрешен и назначен этому свойству во время загрузки XAML, который возникает до того, как приложение действительно будет запущено. Он будет назначен только один раз, и любые изменения в словаре ресурсов игнорируются.
A DynamicResource назначает объект Expression для свойства во время загрузки, но на самом деле не ищет ресурс до времени выполнения, когда Объекту выражения предлагается значение. Это откладывает поиск ресурса, пока он не понадобится во время выполнения. Хорошим примером может служить прямая ссылка на ресурс, определенный позже в XAML. Другим примером является ресурс, который даже не будет существовать до выполнения. Он обновит цель, если будет изменен словарь исходного ресурса.
StaticResource будет разрешен при построении объекта. DynamicResource будет оцениваться и разрешаться каждый раз, когда управление требует ресурс.
Разница между StaticResource и DynamicResource заключается в том, как ресурсы извлекаются ссылочными элементами. StaticResource извлекаются только один раз ссылочным элементом и используются на протяжении всего ресурса ресурса. С другой стороны, DynamicResource приобретаются каждый раз, когда используется ссылочный объект.
В чем основное отличие. Подобно последствиям памяти или производительности
Разница между статическими и динамическими ресурсами возникает, когда основной объект изменяется. Если ваша Кисть, определенная в коллекции Ресурсов, была доступна в коде и настроена на другой экземпляр объекта, Rectangle не обнаружит это изменение.
Статические ресурсы извлекаются один раз путем ссылки на элемент и используются для ресурса ресурса. Принимая во внимание, что DynamicResources извлекаются каждый раз, когда они используются.
Недостатком динамических ресурсов является то, что они имеют тенденцию к снижению производительности приложений.
Существуют ли правила WPF, такие как «кисти всегда статичны» и «шаблоны всегда динамичны» и т. д. ?
. Лучшей практикой является использование статических ресурсов, если не существует определенной причины, по которой вы хотите динамически изменять ресурс в динамическом коде. Другим примером примера, в котором вы хотели бы использовать динамические резорбции, является использование SystemBrushes, SystenFonts и системных параметров.
Я тоже был смущен. См. Этот пример ниже:
<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:
Надеюсь, я немного смутил.
Ниже приведены основные различия между статическими и динамическими ресурсами:
2.Динамический ресурс имеет больше служебных издержек, чем статические ресурсы, потому что он ищет ресурсы каждый раз, когда он запрашивает или нуждается.
3. Статический ресурс быстрее, но для загрузки требуется немного больше времени страницы или окна, чем динамический ресурс, потому что динамические ресурсы загружаются, когда вы их используете.
Статические отобранные ресурсы оценивают ресурс только один раз, а после этого, если ресурсы меняются, эти изменения не отражаются в привязке. Хотя динамические связанные ресурсы оцениваются каждый раз, когда ресурс необходим.
Предположим, что у вас есть этот вложенный словарь стиля. 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 как розовую, если она отображает сетку.
[/g0] StaticResource
[/g1] DynamicResource
Имейте в виду, что VS Designer рассматривает DynamicResource как StaticResource. Он получит первое значение. В этом случае VS Designer будет отображать кнопку LightGreen, хотя на самом деле она заканчивается как Pink.
StaticResource выдает ошибку при удалении стиля корневого уровня (LightGreen).
Логические ресурсы позволяют вам определять объекты в 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
Нашел все полезные ответы, просто хотел добавить еще один вариант использования.
В составном сценарии WPF ваш пользовательский элемент управления может использовать ресурсы, определенные в любом другом родительском окне / элементе управления (что происходит для размещения этого пользовательского элемента управления), ссылаясь на этот ресурс как на DynamicResource.
Как упоминалось другими, Staticresource будет проверяться во время компиляции. Элементы управления пользователя не могут ссылаться на те ресурсы, которые определены в хостинге / родительском контроле. Хотя в этом случае можно использовать DynamicResource.
Динамические ресурсы могут использоваться только тогда, когда свойство устанавливается на объект, который получен из объекта зависимостей или замораживается, где статические ресурсы могут использоваться где угодно. Вы можете абстрагировать весь контроль, используя статические ресурсы.
Статические ресурсы используются при следующих обстоятельствах:
Динамические ресурсы:
Важное преимущество динамических ресурсов
, если запуск приложения занимает очень много времени, вы должны использовать динамические ресурсы, потому что статические ресурсы всегда загружаются при создании окна или приложения, а динамические ресурсы загружаются, когда они сначала используются.
Однако вы не увидите никакой выгоды, если ваш ресурс не будет чрезвычайно большим и сложным.
It will update the target if the source resource dictionary is changed.
– MEMark 16 December 2013 в 19:51