Entwickler-Ecke

WPF / Silverlight - Merkwürdiges Verhalten von StaticResource mit Storyboard


maho2nd - Sa 03.01.09 18:54
Titel: Merkwürdiges Verhalten von StaticResource mit Storyboard
Hallo,

da ich in meiner XAML eine Farbe mehrmals Verwende definiere ich diese am Anfang global:


XML-Daten
1:
2:
3:
<SolidColorBrush x:Key="style_brush1">#FF858585</SolidColorBrush>
<Color x:Key="style_color1">#FF858585</Color>
<Color x:Key="style_color5">#FFFFB400</Color>


nun habe ich z.B. einen Style A:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<Style x:Key="checkBoxMainWindow" BasedOn="{x:Null}" TargetType="{x:Type CheckBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Margin="0,0,0,0">
<Viewbox Stretch="Fill">
<Grid Width="40" Height="80">
<Rectangle x:Name="path" Fill="{StaticResource style_brush1}" RadiusX="4" RadiusY="4"/>
</Grid>
</Viewbox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>


und einen Style B welcher noch ein Hover-Trigger mit Storyboard:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
<Style x:Key="buttonStop" TargetType="{x:Type CheckBox}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type CheckBox}">
          
          <ControlTemplate.Resources>
            <Storyboard x:Key="mouseIn">
              <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="stop" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource style_color1}"/>
                <SplineColorKeyFrame KeyTime="00:00:00.1250000" Value="{StaticResource style_color5}"/>
              </ColorAnimationUsingKeyFrames>
            </Storyboard>
          </ControlTemplate.Resources>
                    
          <Grid Width="80" Height="80">
            <Rectangle x:Name="stop" Margin="22,22,22,22" Fill="{StaticResource style_brush1}" StrokeThickness="1"/>
          </Grid>
          
          <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Trigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource mouseIn}"/>
              </Trigger.EnterActions>
            </Trigger>
          </ControlTemplate.Triggers>
          
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>


wenn ich nun den Style A auf ein Control 1 anwende und den Style B auf ein Control 2 so existiert der merkwürdige Effekt, dass wenn ich über Control 2 mit der Maus darüberfahre es den Hover-Effekt gibt aber gleichzeitig auch auf Control 1 !
Als würde sozusagen das Control 1 das Storyboard von Control 2 übernehmen nur weil in beiden Styles das gleiche Static-Resource auf eine Farbe definiert ist.

Dies ist aber nur der Fall wenn im Style beide die gleiche StaticResource Fill="{StaticResource style_brush1}" zugewiesen ist. Wenn sie unterschiedliche StaticRessourcen zugewiesen bekommen funktioniert es. Ändere ich auf Dynamic-Resource um, so funktioniert es auch korrekt. Jedoch benötige ich für manche Dinge unbedingt static.

Kann jemand den komsiche Effekt erklären und wie man den umgehen kann?


Kha - Sa 03.01.09 23:19

Auch wenn die Brush-Referenz bei beiden Styles statisch ist, zeigen sie immer noch auf dasselbe Objekt. Verhindern kannst du das mit x:Shared="false".


maho2nd - So 04.01.09 00:07

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Auch wenn die Brush-Referenz bei beiden Styles statisch ist, zeigen sie immer noch auf dasselbe Objekt. Verhindern kannst du das mit x:Shared="false".


ok, danke.
Aber wo muss ich das genau verwenden.
Ich erhalte immer die Fehlermeldung:


Quelltext
1:
Das freigegebene Attribut im Namespace "http://schemas.microsoft.com/winfx/2006/xaml" kann nur in kompilierten Ressourcenwörterbüchern verwendet werden.                    


Kha - So 04.01.09 01:10

Ich dachte eigentlich, ein Blick in die Hilfe würde das klären. Das muss in die Resource, die du nicht sharen willst, also in deinen Brush.