1.定义自定义控件
BlinkingImage.cs
:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;namespace YourNamespace
{public class BlinkingImage : Control{public static readonly DependencyProperty ImageSourceProperty =DependencyProperty.Register("ImageSource", typeof(string), typeof(BlinkingImage), new PropertyMetadata(null, OnImageSourceChanged));public static readonly DependencyProperty IsBlinkingProperty =DependencyProperty.Register("IsBlinking", typeof(bool), typeof(BlinkingImage), new PropertyMetadata(false, OnIsBlinkingChanged));public string ImageSource{get { return (string)GetValue(ImageSourceProperty); }set { SetValue(ImageSourceProperty, value); }}public bool IsBlinking{get { return (bool)GetValue(IsBlinkingProperty); }set { SetValue(IsBlinkingProperty, value); }}static BlinkingImage(){DefaultStyleKeyProperty.OverrideMetadata(typeof(BlinkingImage), new FrameworkPropertyMetadata(typeof(BlinkingImage)));}public override void OnApplyTemplate(){base.OnApplyTemplate();if (IsBlinking){StartBlinking();}}private static void OnImageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = d as BlinkingImage;if (control != null){control.UpdateImageSource();}}private static void OnIsBlinkingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = d as BlinkingImage;if (control != null){if ((bool)e.NewValue){control.StartBlinking();}else{control.StopBlinking();}}}private void UpdateImageSource(){Image image = GetTemplateChild("PART_Image") as Image;if (image != null && !string.IsNullOrEmpty(ImageSource)){image.Source = new BitmapImage(new Uri(ImageSource, UriKind.RelativeOrAbsolute));}}private void StartBlinking(){Image image = GetTemplateChild("PART_Image") as Image;if (image != null){DoubleAnimation animation = new DoubleAnimation{From = 1.0,To = 0.0,Duration = new Duration(TimeSpan.FromSeconds(0.5)),AutoReverse = true,RepeatBehavior = RepeatBehavior.Forever};image.BeginAnimation(OpacityProperty, animation);}}private void StopBlinking(){Image image = GetTemplateChild("PART_Image") as Image;if (image != null){image.Opacity = 1.0;image.BeginAnimation(OpacityProperty, null);}}}
}
2. 定义控件样式
Generic.xaml
:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:YourNamespace"><Style TargetType="{x:Type local:BlinkingImage}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:BlinkingImage}"><Image x:Name="PART_Image" /></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>
3.将自定义的控件样式添加到App.xaml文件中
<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Generic.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
4. 使用自定义控件
MainWindow.xaml
:
<Window x:Class="YourNamespace.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:YourNamespace"Title="MainWindow" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><local:BlinkingImage Grid.Row="1" Grid.Column="0" ImageSource="./image.png" Width="50" Height="70" IsBlinking="{Binding ElementName=CkOne,Path=IsChecked}"/><CheckBox Grid.Row="1" Grid.Column="1" x:Name="CkOne" IsChecked="False"/></Grid>
</Window>