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

embedded/2024/12/26 20:59:44/

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/embedded/148994.html

相关文章

LeetCode 3218.切蛋糕的最小总开销 I:记忆化搜索(深度优先搜索DFS)

【LetMeFly】3218.切蛋糕的最小总开销 I&#xff1a;记忆化搜索(深度优先搜索DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-cost-for-cutting-cake-i/ 有一个 m x n 大小的矩形蛋糕&#xff0c;需要切成 1 x 1 的小块。 给你整数 m &#xff0c;n 和…

计算机网络:运输层 —— TCP 的选择确认(SACK)

文章目录 TCP 的选择确认协商与启用工作机制接收方发送方 TCP 的选择确认 在 TCP 传输过程中&#xff0c;由于网络拥塞、链路故障等因素&#xff0c;数据可能会出现丢失或乱序的情况。传统的 TCP 确认机制是累积确认&#xff0c;TCP 接收方只能对按序收到的数据中的最高序号给…

MongoDB部署高可用集群

一、准备工作 修改3台服务器的hostname为mongodb0、mongodb1和mongodb2 vim /etc/hostname vim /etc/hosts 分别配置3个节点的域名 10.5.30.19 mongodb0 10.5.30.14 mongodb1 10.5.30.18 mongodb2关闭防火墙下载mongodb安装包并解压:mongod…

arcface

GitHub - bubbliiiing/arcface-pytorch: 这是一个arcface-pytorch的源码&#xff0c;可以用于训练自己的模型。 https://github.com/deepinsight/insightface/tree/master/recognition/arcface_torch 参考博客 Arcface部署应用实战-CSDN博客 https://zhuanlan.zhihu.com/p/16…

威尔克斯(Wilks)分布

内容来源 应用多元统计分析 北京大学出版社 高惠璇编著 威尔克斯 Λ \Lambda Λ 分布 回顾一元统计中的 F F F 分布 设 ξ ∼ χ 2 ( m ) , η ∼ χ 2 ( n ) \xi\sim\chi^2(m),\eta\sim\chi^2(n) ξ∼χ2(m),η∼χ2(n)&#xff0c;且相互独立&#xff0c;则 F ξ / m η…

游戏引擎学习第59天

回顾并计划接下来的一天 在处理实体的空间划分时&#xff0c;遇到了一些问题。例如&#xff0c;虽然树和玩家应该在某些情况下被排除在外&#xff0c;但目前的系统仍然会出现不合逻辑的渲染结果&#xff0c;这在视觉上并不符合预期。尽管这些问题主要是渲染上的&#xff0c;并…

nacos-服务发现注册

服务发现注册分为三个角色&#xff1a;服务注册中心、服务提供者、服务消费者 服务注册中心&#xff1a;为服务提供者和消费者提供一个空间&#xff0c;服务提供者将自身服务注册到注册中心&#xff0c;仅对外暴露接口&#xff0c;服务消费者在将自身注册到注册中心的时候也会获…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…