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 天前
WPF分哪几块
wpf
newbe365242 天前
我们如何使用 impeccable 优化前端界面设计与实现稳定性
前端·人工智能·分布式·github·aigc·wpf
Chris _data19 天前
WPF 学习第三天 — Modbus RTU 串口通信
hadoop·学习·wpf
布吉岛的石头20 天前
Java 程序员第 43 阶段05:微服务整合大模型,跨服务调用架构设计实战,Seata分布式事务实战
wpf
步步为营DotNet20 天前
基于.NET Aspire 实现云原生应用的高效监控与可观测性
云原生·.net·wpf
芒鸽20 天前
HarmonyOS 分布式开发实战:设备协同、数据共享与跨设备迁移
分布式·wpf·harmonyos
Volunteer Technology20 天前
Flink状态管理与容错(二)
大数据·flink·wpf
happyprince21 天前
07_verl-Trainer模块详解
人工智能·架构·wpf·强化学习
bugcome_com21 天前
WPF + Prism 技术指南与实战项目(二、模板搭建)
wpf
小满Autumn22 天前
log4net 日志框架 — 从配置到实战速查手册
笔记·c#·.net·wpf·上位机·log4net