我有一个 ResourceDictionary,它由一个 Brush 对象和一个 Style 组成,它使用这个 Brush 对象在其 Template 属性中的几个动画属性(通过 StaticResource 标记扩展)。问题是; 当我将字典与全局应用程序 ResourceDictionary (Application.Resources) 合并时,Brush 不会冻结,并且共享 Style 的每个元素都会受到 Brush 更改的影响。
有趣的是,当我将 Brush 移动到辅助合并的 ResourceDictionary 时,它被冻结并且一切都按预期工作(freezable 在动画之前被克隆)只有当可冻结对象和其他一些资源通过 StaticResource 标记引用该对象时才会出现问题扩展驻留在同一个合并的 ResourceDictionary 中。我在下面粘贴了 App.xaml、Window.xaml 和 Dictionary.xaml 的示例代码。如果您能重现相同的结果并确认这是 WPF 中的错误,我将不胜感激。
注意:如果您在 Visual Studio 中将 ResourceDictionary (Dictionary.xaml) 的内容类型从 Page 更改为 Resource(并将其嵌入 XAML 而不是 BAML 版本到编译的程序集中),问题就会消失。
窗口.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>
应用程序.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>
字典.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>