1

我有一个 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>

4

1 回答 1

1

这是想要的功能。但是您仍然可以通过演示选项 xml 命名空间冻结画笔,如下所示:http: //blog.lexique-du-net.com/index.php ?post/2010/04/12/Freeze-brushes-directly-在-the-XAML-to-improve-your-application-s-performances

问候,

于 2011-08-30T09:53:17.543 回答