WPF Объединенные несоответствия ResourceDictionary
У меня есть ResourceDictionary, который состоит из объекта Brush и стиля, использующего этот объект Brush для нескольких анимированных свойств в свойстве Template (через расширение разметки StaticResource). Проблема в; когда я объединяю словарь с глобальным приложением ResourceDictionary (Application.Resources), кисть не замораживается, и на каждый элемент, совместно использующий стиль, влияют изменения в кисти.
Интересно, что когда я перемещаю Brush во вторичный объединенный ResourceDictionary, он замораживается, и все работает, как и ожидалось (freezable клонируется перед тем, как анимироваться). Проблема возникает, только когда замораживаемый объект и некоторые другие ресурсы ссылаются на этот объект через разметку StaticResource расширение находится в том же объединенном ResourceDictionary. Я вставил пример кода для App.xaml, Window.xaml и Dictionary.xaml ниже. Я был бы очень признателен, если бы вы могли воспроизвести тот же результат и подтвердить, что это ошибка в WPF.
ПРИМЕЧАНИЕ. Если вы измените тип содержимого ResourceDictionary (Dictionary.xaml) с Page на Resource в Visual Studio (и, соответственно, внедрите XAML вместо его версии BAML в скомпилированную сборку), проблема исчезнет.
Window.xaml
<Window x:Class="WpfApplication1.Window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="300">
<StackPanel>
<Button Height="30" Content="Test 1" Margin="5" />
<Button Height="30" Content="Test 2" Margin="5" />
</StackPanel>
App.xaml
<Application x:Class="WpfApplication.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Dictionary.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="backgroundBrush" Color="Aqua" />
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="border" Background="{StaticResource backgroundBrush}">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Opacity" To="0" Duration="0:0:.2" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Opacity" To="1" Duration="0:0:.2" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
1 ответ
Это требуемая особенность. Но вы все равно можете заморозить кисти через пространство имен XML параметров презентации, как указано здесь: http://blog.lexique-du-net.com/index.php?post/2010/04/12/Freeze-brushes-directly-in-the-XAML-to-improve-your-application-s-performances
С Уважением,