WPF制作图片闪烁的自定义控件

devtools/2024/12/27 2:42:20/

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>


http://www.ppmy.cn/devtools/145690.html

相关文章

STM32HAL库中RTC闹钟设置时分秒,年月日

在STM32的HAL库中&#xff0c;RTC&#xff08;实时时钟&#xff09;模块提供了多种功能来管理时间和日期&#xff0c;包括设置闹钟。对于RTC闹钟功能&#xff0c;确实主要集中在时、分、秒的配置上&#xff0c;但年、月、日也可以通过RTC日期寄存器进行设置&#xff0c;并且可以…

Flutter persistentFooterButtons控件详解

文章目录 1. persistentFooterButtons 的用途2. persistentFooterButtons 的定义3. persistentFooterButtons 的基本用法示例 1&#xff1a;简单的底部按钮解释&#xff1a; 4. persistentFooterButtons 的常见用法示例 2&#xff1a;使用不同的按钮类型解释&#xff1a;示例 3…

中关村科金海外外呼机器人如何通过大数据分析帮助跨境电商实现精准营销?

精准营销是企业提升市场竞争力、优化客户体验和实现可持续增长的关键策略。与传统的广撒网式营销不同&#xff0c;精准营销通过数据分析、人工智能和机器学习等先进技术&#xff0c;深入了解客户的偏好、行为和需求&#xff0c;从而提供高度个性化的产品和服务推荐。中关村科金…

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…

游戏引擎学习第52天

仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中&#xff0c;实体被分为不同的类别&#xff1a;接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理&#xff0c;接…

机器学习-梯度下降+小批量梯度下降+数据归一化

文章目录 梯度下降小批量梯度下降多轮训练 数据归一化归一化原因损失函数等高线归一化 梯度下降 当前参数-损失函数关于参数的导数新参数&#xff0c;新参数会往损失函数减少的方向变化 小批量梯度下降 小批量梯度下降&#xff1a;每次选择部分数据计算损失率进行梯度下降 随…

Git(9)之创建新空白分支

Git(8)之创建新空白分支 Author&#xff1a;Once Day Date&#xff1a;2024年12月21日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…

学习记录2024/12/25;用C语言实现通讯录功能

test.c&#xff08;测试逻辑&#xff09; #define _CRT_SECURE_NO_WARNINGS #include "contact.h"int main() {int input 0;Contact con;InitContact(&con);void (*function[])(Contact*) { AddContact,DelContact,SearchContact,ModifyContact,ShowContact,S…