WP版的QQ提示消息的时候从顶部滑入,3秒后从顶部滑出,本文模仿该效果实现一个MessageToastManager类用于显示提示消息
思路很简单,就是动画而已,支持配置颜色和回掉
// ************************************************* // // 作者:bomo // 小组:WP开发组 // 创建日期:2014/7/7 15:18:12 // 版本号:V1.00 // 说明: // // ************************************************* // // 修改历史: // Date WhoChanges Made // 2014/7/7 15:18:12 bomo Initial creation // // ************************************************* using System; using System.Diagnostics; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; using System.Windows.Media.Animation; namespace XTuOne.Utility.Helpers { /// <summary> /// 消息提示工具 /// </summary> public class MessageToastManager { private static readonly Color defaultForegroundColor = Color.FromArgb(255, 255, 144, 0); private static readonly Color defaultBackgroundColor = Colors.White; public static void Show(string text, Action complete = null, double height = 40) { Show(text, defaultForegroundColor, defaultBackgroundColor, complete, height); } public static void Show(string text, Color foregroundColor, Color backgroundColor, Action complete = null, double height = 40) { Show(text, new SolidColorBrush(foregroundColor), new SolidColorBrush(backgroundColor), complete, height); } public static void Show(string text, Brush foregroundBrush, Brush backgroundBrush, Action complete = null, double height = 40) { var p = new Popup { Child = new Border { Width = Application.Current.Host.Content.ActualWidth, Background = backgroundBrush, Child = new TextBlock { Text = text, Foreground = foregroundBrush, FontSize = (double)Application.Current.Resources["PhoneFontSizeNormal"], VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(10, 0, 0, 0) } } }; Show(p, complete, height); } private static void Show(Popup popup, Action complete = null, double height = 40) { if (!(popup.Child.RenderTransform is CompositeTransform)) { popup.Child.RenderTransform = new CompositeTransform(); } ((CompositeTransform)popup.Child.RenderTransform).TranslateY = -height; Debug.Assert(popup.Child is FrameworkElement); var element =popup.Child as FrameworkElement; element.Height = height; var storyboard = new Storyboard { AutoReverse = false }; var doubleAnimaionUsingKeyFrames = new DoubleAnimationUsingKeyFrames(); Storyboard.SetTarget(doubleAnimaionUsingKeyFrames, popup.Child); Storyboard.SetTargetProperty(doubleAnimaionUsingKeyFrames, new PropertyPath("(UIElement.Opacity)", new object[0])); storyboard.Children.Add(doubleAnimaionUsingKeyFrames); //0.5秒透明度从0-1 var doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)), Value = 1, EasingFunction = new CubicEase {EasingMode = EasingMode.EaseOut} }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.4)), Value = 0.995, EasingFunction = new CubicEase { EasingMode = EasingMode.EaseIn } }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)), Value = 0.1, }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); doubleAnimaionUsingKeyFrames = new DoubleAnimationUsingKeyFrames(); Storyboard.SetTarget(doubleAnimaionUsingKeyFrames, popup.Child); Storyboard.SetTargetProperty(doubleAnimaionUsingKeyFrames, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)", new object[0])); storyboard.Children.Add(doubleAnimaionUsingKeyFrames); doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)), Value = 0, EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.4)), Value = 0, }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); doubleKeyFrame = new EasingDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)), Value = -height, EasingFunction = new CubicEase { EasingMode = EasingMode.EaseIn } }; doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame); var objectAnimaionUsingKeyFrames = new ObjectAnimationUsingKeyFrames(); Storyboard.SetTarget(objectAnimaionUsingKeyFrames, popup); Storyboard.SetTargetProperty(objectAnimaionUsingKeyFrames, new PropertyPath("(Popup.IsOpen)", new object[0])); storyboard.Children.Add(objectAnimaionUsingKeyFrames); var discreteObjectKeyFrame = new DiscreteObjectKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)), Value = true }; objectAnimaionUsingKeyFrames.KeyFrames.Add(discreteObjectKeyFrame); discreteObjectKeyFrame = new DiscreteObjectKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)), Value = false }; objectAnimaionUsingKeyFrames.KeyFrames.Add(discreteObjectKeyFrame); if (complete!=null) { storyboard.Completed += (s, e) => complete.Invoke(); } storyboard.Begin(); } } }