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>
相关推荐
预立科技1 小时前
CDN(内容分发网络)知识总结
网络·wpf·cdn
FuckPatience1 天前
WPF DataGrid 行根据某个属性循环变色动画
wpf
一条闲鱼_mytube3 天前
高并发短链接系统设计
wpf
一个天蝎座 白勺 程序猿4 天前
IoTDB集群扩容:从慌乱到从容的经验分享
数据库·wpf·时序数据库·iotdb
samble5 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
samble6 天前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
蜗牛互联网8 天前
OLMo-core 3的token gerrymandering提醒:MoE路由要按时间窗验收
java·人工智能·wpf
LateFrames8 天前
WPF 升级选型:用 .NET 8 还是 .NET 10
.net·wpf·.net8·.net10
samble9 天前
从零搭建灌装监控系统(十):生产追溯,条码触发自动记录
c#·wpf·mvvm·modbus·工业控制
SamChan9011 天前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf