WPF制作图片闪烁的自定义控件
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>