Laden...

UserControl Background blinken lassen ?

Erstellt von snupi vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.700 Views
S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren
UserControl Background blinken lassen ?

Ich möchte den Background meines UserControl's blinken lassen (über ein Property DoBlink(int ms, Color colorOn, Color colorOff)), dh. mit einer bestimmten frequenz und zwei abwechselnden Farben.

Kann ich die Animation direkt in XAML erledigen (Storyboard, VisualStateManager, ...) ?

5.657 Beiträge seit 2006
vor 11 Jahren

über ein Property DoBlink(int ms, Color colorOn, Color colorOff)

Ein Property mit 3 Parametern? Du meinst wohl eher eine Methode bzw. drei Properties?

Kann ich die Animation direkt in XAML erledigen (Storyboard, VisualStateManager, ...) ?

Ja, du kannst ein Storyboard erstellen, die Werte direkt an deine Property(s) binden und dann die Animation per Trigger an- und ausschalten.

Christian

Weeks of programming can save you hours of planning

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

Ja eine Methode bzw. mehrere Properties...

Ich habs mit StoryBoard und EventTrigger probiert, leider habe ich hier immer einen Verlauf zwischen den beiden Farben und nicht nur zb. ROT oder GRÜN .

5.657 Beiträge seit 2006
vor 11 Jahren

Tja, wenn du nicht zeigen willst, was du bisher gemacht hast, dann können wir dir auch nicht so richtig helfen 8)

Weeks of programming can save you hours of planning

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

Hab jetzt mal ein Blinken hinbekommen:

Das muss ich jetzt noch mit Code versehen zum Ein-/Ausschalten + Setzen der Frequenz...


    <UserControl.Triggers>
        <!-- Begin the Storyboard -->
        <EventTrigger RoutedEvent="{x:Static local:MyButton.BlinkOnEvent}">
            <BeginStoryboard Name="myBeginStoryboard">
                <Storyboard Name="myStoryboard" TargetName="rdBtn" Duration="0:0:2" RepeatBehavior="Forever">
                    <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Background.Color">
                        <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                        <DiscreteColorKeyFrame KeyTime="0:0:1" Value="Blue" />
                    </ColorAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <!-- Stop the Storyboard -->
        <EventTrigger RoutedEvent="{x:Static local:MyButton.BlinkOffEvent}">
            <StopStoryboard BeginStoryboardName="myBeginStoryboard" />
        </EventTrigger>
    </UserControl.Triggers>

für die Frequenz und Farbe gibt es dann die Properties:


        public int Rate {
            set {
                myColorAnimationKeyFrames.KeyFrames[1].KeyTime = new TimeSpan(0, 0, 0, 0, value);
                myStoryboard.Duration = new TimeSpan(0, 0, 0, 0, 2 * value);
            }
        }

        public Color OnColor {
            set {
                myColorAnimationKeyFrames.KeyFrames[0].Value = value;
            }
        }

        public Color OffColor {
            set {
                myColorAnimationKeyFrames.KeyFrames[1].Value = value;
            }
        }

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

Ich habe das Blinken nun mal ausgelagert zum Testen:


<Window x:Class="WpfPlayGround.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Button Name="button1" Focusable="False" Background="Gray" Width="100" Height="100">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                            <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Background.Color">
                                <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </Grid>
</Window>

Das Blinken funktioniert nur mit einem gesetzten Background im Button. Falls ich den Background weglasse, bekomme ich die Exception '{"Cannot resolve all property references in the property path 'Background.Color'. Verify that applicable objects support the properties."}'.

Auch das Setzen eines Brushes wie folgt führt zu obiger Exception:


            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                    <GradientStop Color="#FFF3F3F3" Offset="0"/>
                    <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                    <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                    <GradientStop Color="#FFCDCDCD" Offset="1"/>
                </LinearGradientBrush>
            </Button.Background>

Ich möchte den Style des Button so lassen wie er ist (ohne setzen vin Background, dh standardmässig mit Verlauf, wenn man ihn im Designer plaziert) - aber dennoch Blinken lassen...

5.657 Beiträge seit 2006
vor 11 Jahren

Hi snupi,

es würde mich ehrlich gesagt sehr wundern, wenn die zitierte Exception auch bei deinem zweiten Beispielcode geworfen wird.

Im ersten Beispiel würde ich mal probieren, als Storyboard.TargetName "button1.Background" anzugeben und als TargetProperty "Color".

Christian

Weeks of programming can save you hours of planning

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

Haut leider beides nicht hin ... nur das explizite Setzen eines Backgrounds lässt die Exception verschwinden.

5.657 Beiträge seit 2006
vor 11 Jahren

Was heißt "beides"? Ich kann mir nach wie vor nicht vorstellen, daß sich bei deinem zweiten Beispiel eine Exception über ein Property namens Background.Color beschwert.

Was heißt explizites Setzen? Was ist an deinem Beispiel nicht-explizit?

Weeks of programming can save you hours of planning

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

"beides": ich meinte, beide Varianten (1. und 2. Beispiel mit TargetName und TargetProperty)

"Explizites Setzen": Setzen des Backgrounds im Button. Nur wenn dieser im Tag 'Button' gesetzt wird, verschwindet die Exception.

5.657 Beiträge seit 2006
vor 11 Jahren

Sorry, aber deine Antworten werfen regelmäßig mehr Fragen auf als sie beantworten. Wenn du dir nicht ein bißchen mehr Mühe gibst und versuchst, dich etwas klarer auszudrücken oder irgendwie auf die Fragen einzugehen, dann wird sich hier auch keiner die Mühe machen, sich damit auseinanderzusetzen.
Christian

Weeks of programming can save you hours of planning

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

Ok dachte es war klar was ich meine ...

Hier nochmal die Varianten, welche NICHT funktionieren:


<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
         </Button>
     </Grid>
 </Window> 


<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
            <Button.Background>
                 <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                     <GradientStop Color="#FFF3F3F3" Offset="0"/>
                     <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                     <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                     <GradientStop Color="#FFCDCDCD" Offset="1"/>
                 </LinearGradientBrush>
             </Button.Background> 
         </Button>
     </Grid>
 </Window> 

Und hier die Variante, welche funktioniert:



<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Background="Gray" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Background.Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
         </Button>
     </Grid>
 </Window> 

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo,

die ersten beiden Varianten funktionieren natürlich nicht.
Über den TargetName gibst du das Control an von welchem das Property gesetzt werden soll.

D.h. du verwendest das z.B. wenn du den Style nicht direkt im Button selbst drinnen hast.
Wenn du keinen TargetName angibst dann nimmt er AFAIK immer an dass du das aktuelle Control willst. Also in diesem Fall den Button

Die zweite Version funktioniert. Da diese so richtig ist 😃

Grüße
Michael

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

@michlG : Antwort ist mir leider nicht klar. Der TargetName wird ja immer gesetzt (button1)...

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo,

in der ColorAnimationUsingKeyFrames brauchst du den TargetName in diesem Fall nicht zu setzen.
Im StoryBoard ist der TargetName gesetzt. Und das passt so.
Du hast den hier auf Background gesetzt. Was nicht nötig ist.
Wie du siehst ist das im funktionierenden Beispiel nicht gesetzt

Grüße
Michael

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

@michlG : ich habe die Beispiele wieder in ihren Ausgangszustand versetzt - nichtsdestotrotz funktionieren diese wie gesagt nur dann, wenn im Button der Background gesetzt wird...