Laden...

Frage zu VisualStates

Erstellt von Quaneu vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.396 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 12 Jahren
Frage zu VisualStates

Hallo,
ich hätte eine Frage bzgl. VisualStates in WPF. Ich habe ein ControlTemplate, das wie folgt definiert ist:


<ControlTemplate TargetType="{x:Type RadioButton}">
   <Border>
      <ContentPresenter />
      <VisualStateManager.VisualStateGroups>
         <VisualStateGroup x:Name="CommonStates">
            <VisualState x:Name="MouseOver">
               <Storyboard>
                  <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" />
               </Storyboard>
            </VisualState>
            <VisualState x:Name="Normal" />
            <VisualState x:Name="Pressed" />
            <VisualState x:Name="Disabled" />
         </VisualStateGroup>

         <VisualStateGroup x:Name="CheckStates">
             <VisualState x:Name="Checked">
               <Storyboard>
                  <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Yellow" />
               </Storyboard>
            </VisualState>
            <VisualState x:Name="Unchecked" />
            <VisualState x:Name="Indeterminate" />
         </VisualStateGroup>
      </VisualStateManager.VisualStateGroups>
   </Border>
</ControlTemplate>

Ich habe nun folgendes Problem, wenn ich mit der Maus über den selektierten RadioButton fahre, wird dieser gelb. Doch wenn ich mit der Maus den RadioButton wieder "verlasse", wird dieser nicht mehr rot. Dies müsste er aber wieder werden, da der RadioButton ja selektiert ist.

Wie kann man mit VisualState dies bewerkstelligen?

Viele Grüße
Quaneu

699 Beiträge seit 2007
vor 12 Jahren

Hallo,
bin jetzt nicht der WPF Fachmann und hab schon ein bisschen länger nichts mehr mit WPF gemacht.
Wenn ich das noch recht im Kopf habe, musst du dazu 2 VisualState machen ( MouseEnter / MouseLeave ) in denen du dann die beiden Farben angeben kannst.

Grüße
Stephan

U
1.578 Beiträge seit 2009
vor 12 Jahren

Mach das lieber über den Triggers, so lange du kein SL Programmierst bist du auf diese krüppeligen VisualStates nicht angewiesen.

  • In Visual States kann man nur vorhandenes editieren statt komplett neu zu schreiben [Hintergründe mit unterschiedlichen Verläufen ist sehr fummelig],
  • Man ist auf Storyboards begrenzt,
  • Visual States sind deutlich länger
  • Triggers sind einfacher zu handhaben

Hier das was du suchst, ohne das du das MouseLeft o.ä. noch implementieren musst.

<ControlTemplate TargetType="{x:Type RadioButton}">
    <Border>
        <ContentPresenter />
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Red" />
        </Trigger>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="Background" Value="Yellow" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 12 Jahren

Vielen Dank für eure Hilfe.

Dann werde ich wieder auf die Trigger zurückgreifen, da ich nicht vorhabe die Anwendung auch in SL laufen zu lassen.

Viele Grüße
Quaneu

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 12 Jahren

So jetzt hab ich leider gleich die nächste Frage...
Ich versteh nämlich folgendes Verhalten überhaupt nicht...
Das ControlTemplate sieht nun wie folgt aus:


<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Trigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetName="_border"
                            Storyboard.TargetProperty="Background.Color" To="Red" />
                </Storyboard>
            </BeginStoryboard>
        </Trigger.EnterActions>
        <Trigger.ExitActions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetName="_border"
                            Storyboard.TargetProperty="Background.Color" To="DarkGray" />
                </Storyboard>
            </BeginStoryboard>
        </Trigger.ExitActions>
    </Trigger>
    <Trigger Property="IsChecked" Value="True">
        <Trigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetName="_border"
                            Storyboard.TargetProperty="Background.Color" To="Yellow" />
                </Storyboard>
            </BeginStoryboard>
        </Trigger.EnterActions>
        <Trigger.ExitActions>
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetName="_border"
                            Storyboard.TargetProperty="Background.Color" To="DarkGray" />
                </Storyboard>
            </BeginStoryboard>
        </Trigger.ExitActions>
    </Trigger>

Also ich würde gern folgendes haben bei IsMouseOver und IsChecked soll der Hintergrund "Yellow" sein. Ist nur IsMouseOver dann "Red". Bei keinem von beiden, dann "DarkGray".

Bei dem ControlTemplate von oben funktioniert dies leider nicht wie gewünscht. Wenn ich die Maus über einen RadioButton bewegen wird er "Red"und wenn ich ihn verlasse wieder "DrakGray". Wenn ich einen anklicke, wird er "Yellow". Soweit so so gut. Doch wenn ich nun die Maus über einen RadioButton der schon mal angeklickt war bewege, dann bleibt dieser "DarkGray". Und dies verstehe ich gar nicht...

Was mache ich denn falsch?

Viele Grüße
Quaneu