Autor Beitrag
maho2nd
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 03.01.09 18:54 
Hallo,

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

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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:

ausblenden Quelltext
1:
Das freigegebene Attribut im Namespace "http://schemas.microsoft.com/winfx/2006/xaml" kann nur in kompilierten Ressourcenwörterbüchern verwendet werden.					
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=