Entwickler-Ecke

WPF / Silverlight - Eine Frage zur ChangePropertyAction


FrEEzE2046 - Sa 11.12.10 15:46
Titel: Eine Frage zur ChangePropertyAction
Hallo,

ich schreibe gerade einen WPF- in einen Silverlight-Style um. Besser gesagt, ich versuche es. Um das Problem am leichtesten zu beschreiben, hier mal folgendes Beispiel:


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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
<!-- WPF Style implementation -->
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
          <Ellipse x:Name="MyEllipse">
            <Ellipse.Fill>
              <SolidColorBrush Color="Red"/>
            </Ellipse.Fill>
          </Ellipse>
        </Grid>
        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="MyEllipse" Property="Fill">
              <Setter.Value>
                <SolidColorBrush Color="Blue"/>
              </Setter.Value>
            </Setter>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>


<!-- Silverlight 4 Style implementation -->
<Style x:Key="MyButtonStyle" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Grid>
          <Ellipse x:Name="MyEllipse">
            <Ellipse.Fill>
              <SolidColorBrush Color="Red"/>
            </Ellipse.Fill>
          </Ellipse>
          <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseMove">
              <ic:ChangePropertyAction TargetName="MyEllipse" PropertyName="Fill" IsEnabled={Binding IsMouseOver}>
                                <ic:ChangePropertyAction.Value>
                  <SolidColorBrush Color="Blue"/>
                </ic:ChangePropertyAction.Value>
                            </ic:ChangePropertyAction>
            </i:EventTrigger>
          </i:Interaction.Triggers>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>


Also, ganz einfach: Einfache Ellipse mit roter Füllfarbe. Während die Maus über dem Button ist, soll die Füllfarbe blau sein, sonst wieder rot.

Nun gelingt es mir zwar mit dem Code oben die Füllfarbe auf blau zu ändern, sobald die Maus darüber ist, jedoch möchte ich den Wert auch wieder auf "default" zurücksetzen.


Wenn es sich nur um diese Füllfarbe handeln würde, könnte ich die MouseEnter und MouseLeave Events dafür benutzen. Da mein Code jedoch weitaus größer ist (in der Action passiert wesentlich mehr), ist das keine Option.

Wie kann man das am elegantesten lösen und warum funktioniert mein Binding auf "IsEnabled" nicht?


Vielen Dank vorab!


Kha - Sa 11.12.10 15:53

Warum keine Visual States? Die Dinger sind so viel einfacher und eleganter als Trigger (vor allem zusammen mit Blend), dass WPF sie inzwischen sogar übernommen hat :) .


FrEEzE2046 - Sa 11.12.10 17:33

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Warum keine Visual States? Die Dinger sind so viel einfacher und eleganter als Trigger (vor allem zusammen mit Blend), dass WPF sie inzwischen sogar übernommen hat :) .


Hi und danke für deine Antwort. Ich hab mich mit dem VisualStateManager leider überhaupt noch nicht auseinander gesetzt. Ich bin zwar dem nicht abgeneigt, aber ich hab für die Umsetzung nicht mehr viel Zeit.

Hättest du evtl. ein Code-Beispiel, wie es mit Visual States für dieses sehr einfache Beispiel aussehen würde? Wäre wirklich super, wenn's nicht zu viel Arbeit für dich ist.


Kha - Sa 11.12.10 17:39

Mein einziger VSM-Code befindet sich leider bei meiner ehemaligen Praktikumsstelle, die Einzelheiten müsste ich auch erst einmal wieder nachschlagen - oder doch mal Blend installieren, damit sind es ein paar Klicks ;) .


FrEEzE2046 - Sa 11.12.10 19:43

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Mein einziger VSM-Code befindet sich leider bei meiner ehemaligen Praktikumsstelle, die Einzelheiten müsste ich auch erst einmal wieder nachschlagen - oder doch mal Blend installieren, damit sind es ein paar Klicks ;) .


So, ich hab's mit Blend jetzt hinbekommen. Ist wirklich kinderleicht ;) Danke dir.