Оптимизация производительности: Ресурсы приложений
WPF позволяет совместно использовать ресурсы приложения таким образом, можно поддерживать согласованный вид или поведение с помощью элементов одинакового типа. Этот раздел содержит несколько рекомендаций в этой области, которые могут помочь повысить производительность приложений.
Дополнительные сведения о ресурсах см. в разделе Ресурсы XAML.
Совместное использование ресурсов
Если приложение использует пользовательские элементы управления и определяет ресурсы в ResourceDictionary (или узел ресурсов XAML), рекомендуется определить ресурсы на Application или Window объекта уровень, или их определения в тему по умолчанию для пользовательские элементы управления. Определение ресурсов в пользовательский элемент управления ResourceDictionary оказывает влияние на производительность для каждого экземпляра этого элемента управления. Например при наличии кисть производительность операций, определенных как часть определения ресурсов для пользовательского элемента управления и несколько экземпляров пользовательского элемента управления, рабочего набора приложения будет значительно увеличить.
Чтобы проиллюстрировать это, необходимо учитывайте следующее. Предположим, вы разрабатываете карточки игр с помощью WPF. Для большинства карточных игр необходимо 52 карты с 52 разных лиц. Вы решили реализовать пользовательский элемент управления карты и определить 52 кисти (каждый из которых представляет лицевой стороны) в ресурсах карты пользовательского элемента управления. В главном приложении первоначально создается 52 экземпляра этого элемента управления. Каждый экземпляр элемента управления создает 52 экземпляра Brush объекты, которые в итоге 52 * 52 дает Brush объектов в приложении. Перемещая кисти из ресурсов пользовательского элемента управления к Application или Window уровне объекта или определяя их в тему по умолчанию для пользовательского элемента управления, можно уменьшить рабочего набора приложения, так как теперь общего 52 кисти 52 экземпляра элемента управления.
Совместное использование кистей без копирования
Если у вас есть несколько элементов, используя те же Brush объекта, определение кисть как ресурс и создание ссылки, но не определение встроенной кисти в XAML. Этот метод будет создать один экземпляр и повторно использует его, тогда как определение встроенной кисти в XAML создает новый экземпляр для каждого элемента.
В следующем примере разметки показано этой точки.
<StackPanel.Resources>
<LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</StackPanel.Resources>
<!-- Non-shared Brush object. -->
<Label>
Label 1
<Label.Background>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Label.Background>
</Label>
<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>
Используйте статические ресурсы, когда это возможно
Статический ресурс обеспечивает значение для любого атрибута свойства XAML, поиска ссылки на уже определенный ресурс. Поведение подстановки для этого ресурса является аналогом во время компиляции.
Динамический ресурс, с другой стороны, создаст временное выражение во время первоначальной компиляции и таким образом, отложит для ресурсов, пока значение запрошенного ресурса не нужен для создания объекта. Поведение подстановки для этого ресурса аналогичен во время выполнения, который оказывает влияние на производительность. Используйте статические ресурсы, когда это возможно в приложении, с помощью динамические ресурсы только при необходимости.
В следующем примере разметки показано использование обоих типов ресурсов:
<StackPanel.Resources>
<SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>
<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>
<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>