1

これは、Brush オブジェクトと、この Brush オブジェクトを Template プロパティのいくつかのアニメーション化されたプロパティに使用する Style で構成されます (StaticResource マークアップ拡張を介して)。問題は; ディクショナリをグローバル アプリケーション ResourceDictionary (Application.Resources) とマージすると、ブラシはフリーズせず、スタイルを共有するすべての要素がブラシへの変更の影響を受けます。

興味深いことに、ブラシをマージされたセカンダリ ResourceDictionary に移動すると、ブラシがフリーズされ、すべてが期待どおりに機能します (フリーズ可能なオブジェクトは、アニメーション化される前に複製されます)。この問題は、フリーズ可能なオブジェクトと、StaticResource マークアップを介してこのオブジェクトを参照する他のリソースの場合にのみ発生します。拡張子は、同じマージされた ResourceDictionary に存在します。App.xaml、Window.xaml、Dictionary.xaml のサンプル コードを以下に貼り付けました。同じ結果を再現し、これが WPF のバグであることを確認していただければ幸いです。

注: Visual Studio で ResourceDictionary (Dictionary.xaml) のコンテンツ タイプを Page から Resource に変更すると (そして、その BAML バージョンではなく XAML をコンパイル済みアセンブリに埋め込むと)、問題はなくなります。

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>

4

1 に答える 1

1

これは欲しい機能です。ただし、ここで指摘されているように、プレゼンテーション オプション xml 名前空間を介してブラシをフリーズすることもできます。 XAML 内でアプリケーションのパフォーマンスを改善する

よろしく、

于 2011-08-30T09:53:17.543 に答える