| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- using System;
- using System.Timers;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Media;
- namespace Muchinfo.WPF.Controls.Border
- {
- public class ExpBorder : System.Windows.Controls.Border
- {
- static ExpBorder()
- {
- DefaultStyleKeyProperty.OverrideMetadata(typeof(ExpBorder), new FrameworkPropertyMetadata(typeof(ExpBorder)));
- }
- //创建动画故事板
- // private Storyboard storyboard = new Storyboard();
- //Color动画
- // private ColorAnimation _colorAnimation = new ColorAnimation();
- private System.Timers.Timer _systemTimer = new Timer();
- private bool _isInitTime = true; //是否是第一次初始化
- public ExpBorder()
- {
- BorderThickness = new Thickness(1);//设置默认边框
- BorderBrush = Brushes.Transparent;
- if (IsBorderThickness)
- Background = Brushes.Transparent;
- // storyboard.Completed += storyboard_Completed;
- Margin = new Thickness(1);
- //_colorAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
- //_colorAnimation.BeginTime = new TimeSpan(0, 0, 0);
- //_colorAnimation.RepeatBehavior = new RepeatBehavior(1);
- //_colorAnimation.AccelerationRatio = 1;
- _systemTimer.AutoReset = false;
- _systemTimer.Interval = 1000;
- _systemTimer.Elapsed += _systemTimer_Elapsed;
- DataContextChanged += ExpBorder_DataContextChanged;
- }
- void _systemTimer_Elapsed(object sender, ElapsedEventArgs e)
- {
- //throw new NotImplementedException();
- this.Dispatcher.BeginInvoke(new Action(() =>
- {
- BorderBrush = Brushes.Transparent;
- if (IsBorderThickness)
- Background = Brushes.Transparent;
- }));
- }
- //DataGrid虚拟化时没有新增Row而是改变数据源
- private void ExpBorder_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
- {
- if (e.OldValue == null)
- {
- //第一次初始化时判断是否显示动画
- GetChildTextStatus(sender as DependencyObject);
- }
- else
- {
- // storyboard.Stop(); //停止之前开始的动画
- BorderBrush = Brushes.Transparent;
- if (IsBorderThickness)
- Background = Brushes.Transparent;
- _systemTimer.Stop();
- _isInitTime = true; //数据源改变时,默认为第一次加载,不进行动画
- }
- }
- void storyboard_Completed(object sender, EventArgs e)
- {
- //storyboard.Stop();
- _systemTimer.Stop();
- }
- /// <summary>
- /// 使用故事板创建动画
- /// </summary>
- private void CreateAnimationByStoryboard()
- {
- var solidcolor = ChangeBrush as SolidColorBrush;
- //storyboard.Stop();
- //storyboard.Children.Clear(); //清除以前动画更新动画
- _systemTimer.Stop();
- if (solidcolor != null)
- {
- BorderBrush = ChangeBrush;
- if (IsBorderThickness)
- Background = ChangeBrush;
- //_colorAnimation.From = solidcolor.Color;
- //_colorAnimation.To = solidcolor.Color;
- //Storyboard.SetTarget(_colorAnimation, this);
- //Storyboard.SetTargetProperty(_colorAnimation, new PropertyPath("(Border.BorderBrush).(SolidColorBrush.Color)"));
- //storyboard.Children.Add(_colorAnimation);
- //storyboard.Begin();
- _systemTimer.Start();
- }
- }
- /// <summary>
- /// 用于绑定改变的颜色
- /// </summary>
- public Brush ChangeBrush
- {
- get { return (Brush)GetValue(ChangeBrushProperty); }
- set { SetValue(ChangeBrushProperty, value); }
- }
- // Using a DependencyProperty as the backing store for ChangeBrush. This enables animation, styling, binding, etc...
- public static readonly DependencyProperty ChangeBrushProperty =
- DependencyProperty.Register("ChangeBrush", typeof(Brush), typeof(ExpBorder),new PropertyMetadata(Brushes.Transparent));
- //当动画值改变时开始动画
- private static void OnVauleChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var expBorder = d as ExpBorder;
- // GetChildTextStatus(d);
- if (expBorder == null) return;
- if (!expBorder._isInitTime)
- {
- expBorder.CreateAnimationByStoryboard();
- }
- else
- {
- expBorder._isInitTime = false;
- }
- }
- /// <summary>
- /// 值是否改变
- /// </summary>
- public bool IsVauleChange
- {
- get { return (bool)GetValue(IsVauleChangeProperty); }
- set { SetValue(IsVauleChangeProperty, value); }
- }
- // Using a DependencyProperty as the backing store for IsVauleChange. This enables animation, styling, binding, etc...
- public static readonly DependencyProperty IsVauleChangeProperty =
- DependencyProperty.Register("IsVauleChange", typeof(bool), typeof(ExpBorder), new PropertyMetadata(false, OnVauleChange));
- /// <summary>
- /// 是否填充背景(默认只填充边框)
- /// </summary>
- public bool IsBorderThickness
- {
- get { return (bool)GetValue(IsBorderThicknessProperty); }
- set { SetValue(IsBorderThicknessProperty, value); }
- }
- public static readonly DependencyProperty IsBorderThicknessProperty =
- DependencyProperty.Register("IsBorderThickness", typeof(bool), typeof(ExpBorder), new PropertyMetadata(false));
- /// <summary>
- /// 判断是否为第一次加载
- /// </summary>
- /// <param name="d">当前对象</param>
- private static void GetChildTextStatus(DependencyObject d)
- {
- if (d is ExpBorder)
- {
- var border = d as ExpBorder;
- var textBlock = border.Child as TextBlock;
- if (textBlock == null) return;
- border._isInitTime = string.IsNullOrEmpty(textBlock.Text) || "-".Equals(textBlock.Text);
- }
- }
- }
- }
|