我有一个ResourceDictionary,它包含一个Brush对象和一个Style,它使用这个Brush对象为其Template属性中的几个动画属性(通过StaticResource标记扩展)。问题是;当我将字典与全局应用程序ResourceDictionary(Application.Resources)合并时,Brush不会被冻结,并且共享Style的每个元素都会受到Brush更改的影响。
有趣的是,当我将Brush移动到辅助合并的ResourceDictionary时,它会被冻结并且一切都按预期工作(freezable在动画之前被克隆)只有当freezable对象和其他一些资源通过引用此对象时才会出现问题StaticResource标记扩展名驻留在同一个合并的ResourceDictionary中。我粘贴了下面的App.xaml,Window.xaml和Dictionary.xaml的示例代码。如果您能够重现相同的结果并确认这是WPF中的错误,我将不胜感激。
注意:如果在Visual Studio中将ResourceDictionary(Dictionary.xaml)的内容类型从“页面”更改为“资源”(并将其中的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>
答案 0 :(得分: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
此致