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, ...) ?
ü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
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 .
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
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;
}
}
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...
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
Haut leider beides nicht hin ... nur das explizite Setzen eines Backgrounds lässt die Exception verschwinden.
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
"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.
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
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>
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
@michlG : Antwort ist mir leider nicht klar. Der TargetName wird ja immer gesetzt (button1)...
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
@michlG : ich habe die Beispiele wieder in ihren Ausgangszustand versetzt - nichtsdestotrotz funktionieren diese wie gesagt nur dann, wenn im Button der Background gesetzt wird...