using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; namespace BBWY.Controls { [StyleTypedProperty(Property = "Style", StyleTargetType = typeof(BTextBoxAnimation))] public class BTextBoxAnimation : BTextBox { public static readonly DependencyProperty WaterRemarkTopStateColorProperty = DependencyProperty.Register("WaterRemarkTopStateColor", typeof(Brush), typeof(BTextBoxAnimation)); public static readonly DependencyProperty WaterRemarkStateProperty = DependencyProperty.Register("WaterRemarkState", typeof(WaterRemarkState), typeof(BTextBoxAnimation), new PropertyMetadata(WaterRemarkState.Normal, new PropertyChangedCallback((d, e) => { if (e.OldValue != e.NewValue) { (d as BTextBoxAnimation).PlayWaterRemarkAnimation(); } }))); private TextBlock txtRemark; private TimeSpan animationTimeSpan = new TimeSpan(0, 0, 0, 0, 200); private IEasingFunction animationEasingFunction = new PowerEase() { EasingMode = EasingMode.EaseInOut }; public Brush WaterRemarkTopStateColor { get { return GetValue(WaterRemarkTopStateColorProperty) as Brush; } set { SetValue(WaterRemarkTopStateColorProperty, value); } } public WaterRemarkState WaterRemarkState { get { return (WaterRemarkState)Convert.ToInt32(GetValue(WaterRemarkStateProperty)); } set { SetValue(WaterRemarkStateProperty, value); } } static BTextBoxAnimation() { DefaultStyleKeyProperty.OverrideMetadata(typeof(BTextBoxAnimation), new FrameworkPropertyMetadata(typeof(BTextBoxAnimation))); } public BTextBoxAnimation() { this.Loaded += QLTextBoxAnimation_Loaded; } public override void OnApplyTemplate() { txtRemark = GetTemplateChild("txtRemark") as TextBlock; base.OnApplyTemplate(); } private void QLTextBoxAnimation_Loaded(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(Text)) WaterRemarkState = WaterRemarkState.Top; } protected override void OnTextChanged(TextChangedEventArgs e) { base.OnTextChanged(e); if (!this.IsLoaded) return; if (string.IsNullOrEmpty(Text)) WaterRemarkState = WaterRemarkState.Normal; else WaterRemarkState = WaterRemarkState.Top; } protected override void OnGotFocus(RoutedEventArgs e) { base.OnGotFocus(e); WaterRemarkState = WaterRemarkState.Top; } protected override void OnLostFocus(RoutedEventArgs e) { base.OnLostFocus(e); if (string.IsNullOrEmpty(Text)) WaterRemarkState = WaterRemarkState.Normal; } private void PlayWaterRemarkAnimation() { var fontsize = WaterRemarkState == WaterRemarkState.Normal ? FontSize : 10.5; var row = WaterRemarkState == WaterRemarkState.Normal ? 1 : 0; var storyboard = new Storyboard(); var daukf_Remark_FontSize = new DoubleAnimationUsingKeyFrames(); daukf_Remark_FontSize.KeyFrames.Add(new EasingDoubleKeyFrame(fontsize, animationTimeSpan, animationEasingFunction)); Storyboard.SetTargetProperty(daukf_Remark_FontSize, new PropertyPath("(TextBlock.FontSize)")); Storyboard.SetTarget(daukf_Remark_FontSize, txtRemark); storyboard.Children.Add(daukf_Remark_FontSize); var i32aukf_Remark_Row = new Int32AnimationUsingKeyFrames(); i32aukf_Remark_Row.KeyFrames.Add(new EasingInt32KeyFrame(row, animationTimeSpan, animationEasingFunction)); Storyboard.SetTargetProperty(i32aukf_Remark_Row, new PropertyPath("(Grid.Row)")); Storyboard.SetTarget(i32aukf_Remark_Row, txtRemark); storyboard.Children.Add(i32aukf_Remark_Row); storyboard.Begin(); } } public enum WaterRemarkState { Normal, Top } }