Aby umożliwić większą kontrolę szybkości migania i tym podobnych w twoim kodzie, sugerowałbym posiadanie zdarzenia routowanego w twoim UserControl o nazwie Blink:
public static readonly RoutedEvent BlinkEvent = EventManager.RegisterRoutedEvent("Blink", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(LedControl));
public event RoutedEventHandler Blink
{
add { AddHandler(BlinkEvent, value); }
remove { RemoveHandler(BlinkEvent, value); }
}
W kodzie tyłu można skonfigurować timer podnieść zdarzenie jednak często chcesz (w tym także daje możliwość migać świetle jeden raz, kiedy tylko chcesz Ty:
RaiseEvent(new RoutedEventArgs(LedControl.Blink));
teraz w XAML następujący kod spowodowałby, że blask byłby widoczny, i ustaw właściwości wypełnienia elipsy (ledEllipse) na jasnozielony gradient radialny, a następnie przywróci wartość wypełnienia do ciemniejszego "nieoświetlonego" zielonego (który można zmienić na szary, jeśli lubisz). Możesz po prostu zmienić czas trwania, aby błyskać dłużej.
<UserControl.Triggers>
<EventTrigger RoutedEvent="local:LedControl.Blink">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="glow"
Storyboard.TargetProperty="Opacity"
To="100"
AutoReverse="True"
Duration="0:0:0.075" />
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ledEllipse"
Storyboard.TargetProperty="Fill"
Duration="0:0:0.15">
<ObjectAnimationUsingKeyFrames.KeyFrames>
<DiscreteObjectKeyFrame KeyTime="0:0:0.01">
<DiscreteObjectKeyFrame.Value>
<RadialGradientBrush>
<!--bright Green Brush-->
<GradientStop Color="#FF215416" Offset="1"/>
<GradientStop Color="#FE38DA2E" Offset="0"/>
<GradientStop Color="#FE81FF79" Offset="0.688"/>
</RadialGradientBrush>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame KeyTime="0:0:0.15" >
<DiscreteObjectKeyFrame.Value>
<RadialGradientBrush>
<!--dim Green Brush-->
<GradientStop Color="#FF21471A" Offset="1"/>
<GradientStop Color="#FF33802F" Offset="0"/>
<GradientStop Color="#FF35932F" Offset="0.688"/>
</RadialGradientBrush>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames.KeyFrames>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</UserControl.Triggers>
Również jestem bezpośrednio przedstawieniu elipsę „ledEllipse” i to odpowiada DropShadowEffect „blask”, które są zdefiniowane w ledControl następująco (Redlight jest tylko kolejnym promieniowy szczotka gradientu że zacznę moją własność wypełnienia LED at) :
<Ellipse x:Name="statusLight" Height="16" Width="16" Margin="0" Fill="{DynamicResource redLight}" >
<Ellipse.Effect>
<DropShadowEffect x:Name="glow" ShadowDepth="0" Color="Lime" BlurRadius="10" Opacity="0" />
</Ellipse.Effect>
</Ellipse>
Uwaga: DropShadowEffect został wprowadzony w .NET 3.5, ale można usunąć, że jeśli nie chce efekt poświaty (ale ładnie wygląda na jednolitym tle kontrastowym kolorze).
Zakładam, że próbujesz wykonać animację w Visual Studio - użyj do tego funkcji Expression Blend - ma ona narzędzie do projektowania animacji. –
Jestem. Przyznam, że po tym, jak spędziłem trochę czasu, nigdzie nie dotarłem i nie dotrzymałem terminu, zacząłem się trochę denerwować i trochę straciłem głowę. Uruchomiłem Expression Blend i zobaczyłem, że utworzony przez ciebie storyboard działa dobrze. Potrzebowałem tylko drobnych korekt, aby uzyskać pożądane zachowanie. – MedicineMan
Czy można to zrobić za pomocą czegoś takiego jak zegar lub oddzwanianie, z dwoma elipsami, których widoczność zmienia się na przemian? Ale ja też lubię odpowiedź Pax. :) –