2011-02-01 4 views
3

フォアグラウンドカラーに同じStaticResourceを使用する2つのテキストボックスがあります。WPF:StaticResourceをアニメーション化すると、そのリソースを使用する他のコントロールが更新されます

最初のTextBoxの色を変更するアニメーションを適用すると、2番目のTextBoxの色も変更されます。

StaticResourceを使用しない場合はこのようなことは起こりません。最初のTextBoxのフォアグラウンドカラーではなく、リソース内で定義されたブラシの色がアニメーションによって変更されていると思います。

ここに私が使用しているコードがあります。

<Page.Resources> 
    <SolidColorBrush x:Key="TextBrush" 
        Color="Black" /> 

    <Storyboard x:Key="Glow" 
       TargetProperty="Foreground.Color" 
       Storyboard.TargetName="txt1"> 
     <ColorAnimation To="Blue" 
         Duration="0:0:0.1" /> 
    </Storyboard> 
    <Storyboard x:Key="Normal" 
       TargetProperty="Foreground.Color" 
       Storyboard.TargetName="txt1"> 
     <ColorAnimation To="Yellow" 
         Duration="0:0:0.1" /> 
    </Storyboard> 
</Page.Resources> 

<StackPanel> 
    <StackPanel.Triggers> 
     <EventTrigger RoutedEvent="StackPanel.MouseEnter"> 
      <BeginStoryboard Storyboard="{StaticResource Glow}" /> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="StackPanel.MouseLeave"> 
      <BeginStoryboard Storyboard="{StaticResource Normal}" /> 
     </EventTrigger> 
    </StackPanel.Triggers> 

    <TextBlock Name="txt1" 
       Foreground="{StaticResource TextBrush}">Text One</TextBlock> 
    <TextBlock Name="txt2" 
       Foreground="{StaticResource TextBrush}">Text Two</TextBlock> 
</StackPanel> 

とにかくこの周辺にはありますか?リソース自体を変更しますアニメーションでForegroundを変更、結合に単一StaticResourceを使用することにより、マット

答えて

3

。この動作は設計上のもので、他にはリソースの完全なコピーが必要となるため、最初はStaticResourceを使用することの有用性とメリットが大幅に削減されます。

簡単な回避策はここではStaticResourceを使用しないか、TextBoxごとに別のリソースを使用することです。

+0

おそらく、リソース上で 'x:Shared =" False "'を設定するだけです。しかし、それを検証していない。 –

+0

@Kent: "WPFでは、リソースのデフォルトのx:Shared条件がtrueです。この条件は、特定のリソース要求が常に同じインスタンスを返すことを意味します。私はそれが単にブラシに "参照"を共有していると思う。 Brushが値型の場合、これはうまくいくが、ここでは、既定で既に設定されているので、効果があるとは思っていない。 ;) –

関連する問題