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