<wp8>_______关键帧动画(DoubleAnimationUsingKeyFrames)、自定义对话框

<UserControl x:Class="CustCtrlClassLibrary.PopupView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480" mc:Ignorable="d">

    <Grid x:Name="LayoutRoot">
        <Rectangle x:Name="mask" Fill="{StaticResource PhoneForegroundBrush}" Opacity="0" MouseLeftButtonDown="mask_MouseLeftButtonDown"/>
        <Grid x:Name="popupArea" VerticalAlignment="Center">
            <Grid.RenderTransform>
                <CompositeTransform x:Name="popupTransform"/>
            </Grid.RenderTransform>
            <Grid x:Name="contentArea" RenderTransformOrigin="0.5,0.5" Background="{StaticResource PhoneBackgroundBrush}">
                <Grid.RenderTransform>
                    <CompositeTransform/>
                </Grid.RenderTransform>
            </Grid>
        </Grid>
    </Grid>
    
</UserControl>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
using Microsoft.Phone.Shell;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using System.Windows.Media.Animation;
using System.Windows.Controls.Primitives;

namespace CustCtrlClassLibrary
{
    public partial class PopupView : UserControl
    {
        #region Constructor
        private bool IsAutoClose = true;
        private int storyType = 0;

        public PopupView(PhoneApplicationPage basePage, bool isAutoClose, int storytype = 0)
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(PopupCotainer_Loaded);
            _BasePage = basePage; IsAutoClose = isAutoClose; storyType = storytype;
            _BasePage.BackKeyPress += BasePage_BackKeyPress;
        }

        #endregion

        #region Property

        private PhoneApplicationPage _BasePage;
        private FrameworkElement _PopupContent { get; set; }
        Popup _Popup;
        CubicEase _EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseInOut };

        public bool IsShown
        {
            get
            {
                return _Popup.IsOpen;
            }
        }

        #endregion

        #region Private Method

        private void PopupCotainer_Loaded(object sender, RoutedEventArgs e)
        {
            if (_BasePage.ApplicationBar != null)
                _BasePage.ApplicationBar.IsVisible = false;
            if (storyType == 0) {
                PrepareShowStory().Begin();
            } else if (storyType == 1) {
                LaunchDialog().Begin();
            }
        }

        private void BasePage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
        {
            this.Close();
            e.Cancel = true;
        }

        private Storyboard PrepareShowStory()
        {
            contentArea.Children.Add(_PopupContent);
            UpdateLayout();

            Storyboard story = new Storyboard();
            DoubleAnimation animation;
            animation = new DoubleAnimation();
            animation.From = 0 - popupArea.ActualHeight;
            animation.To = SystemTray.IsVisible ? 32 : 0;
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(300));
            animation.EasingFunction = _EasingFunction;
            Storyboard.SetTarget(animation, popupTransform);
            Storyboard.SetTargetProperty(animation, new PropertyPath("TranslateY"));
            story.Children.Add(animation);

            animation = new DoubleAnimation();
            animation.From = 0;
            animation.To = 0.5;
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(300));
            Storyboard.SetTarget(animation, mask);
            Storyboard.SetTargetProperty(animation, new PropertyPath("(UIElement.Opacity)"));
            story.Children.Add(animation);

            return story;
        }
        private Storyboard PrepareCloseStory()
        {
            Storyboard story = new Storyboard();
            DoubleAnimation animation;

            story.Completed += new EventHandler(StoryReverse_Completed);
            animation = new DoubleAnimation();
            animation.From = popupTransform.TranslateY;
            animation.To = 0 - popupArea.ActualHeight;
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(300));
            animation.EasingFunction = _EasingFunction;
            Storyboard.SetTarget(animation, popupTransform);
            Storyboard.SetTargetProperty(animation, new PropertyPath("TranslateY"));
            story.Children.Add(animation);

            animation = new DoubleAnimation();
            animation.From = mask.Opacity;
            animation.To = 0;
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(300));
            Storyboard.SetTarget(animation, mask);
            Storyboard.SetTargetProperty(animation, new PropertyPath("(UIElement.Opacity)"));
            story.Children.Add(animation);

            return story;
        }

        private Storyboard LaunchDialog()
        {
            contentArea.Children.Add(_PopupContent);
            UpdateLayout();

            //装载DoubleAnimationUsingKeyFrames动画的故事板
            Storyboard keyFrameboard = new Storyboard();

            #region 后台代码添加DoubleAnimationUsingKeyFrames动画
            DoubleAnimationUsingKeyFrames dakeyframe = new DoubleAnimationUsingKeyFrames();
            //设置border矩形控件的Opacity透明度,并且开始动画事件为0秒的时候。
            Storyboard.SetTarget(dakeyframe, contentArea);
            Storyboard.SetTargetProperty(dakeyframe, new PropertyPath("UIElement.Opacity"));
            dakeyframe.BeginTime = new TimeSpan(0, 0, 0);

            //添加一个在第0.05秒的时候Opacity透明度值为1的关键帧
            SplineDoubleKeyFrame SKeyFrame = new SplineDoubleKeyFrame();
            SKeyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.03));
            SKeyFrame.Value = 1;
            dakeyframe.KeyFrames.Add(SKeyFrame);

            keyFrameboard.Children.Add(dakeyframe);
            #endregion

            #region 后台代码添加DoubleAnimationUsingKeyFrames动画
            DoubleAnimationUsingKeyFrames dakeyscaleX = new DoubleAnimationUsingKeyFrames();
            //设置border矩形控件的ScaleX透明度,并且开始动画事件为0秒的时候。
            Storyboard.SetTarget(dakeyscaleX, contentArea);
            Storyboard.SetTargetProperty(dakeyscaleX, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.ScaleX)"));
            dakeyscaleX.BeginTime = new TimeSpan(0, 0, 0);

            //添加一个在第0秒的时候ScaleX透明度值为0.5的关键帧
            EasingDoubleKeyFrame EKeyFrameX = new EasingDoubleKeyFrame();
            EKeyFrameX.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
            EKeyFrameX.Value = 0.5;
            dakeyscaleX.KeyFrames.Add(EKeyFrameX);

            //添加一个在第0.15秒的时候ScaleX透明度值为1.1的关键帧
            EKeyFrameX = new EasingDoubleKeyFrame();
            EKeyFrameX.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.1));
            EKeyFrameX.Value = 1.1;
            dakeyscaleX.KeyFrames.Add(EKeyFrameX);

            //添加一个在第0.25秒的时候ScaleX透明度值为0.9的关键帧
            EKeyFrameX = new EasingDoubleKeyFrame();
            EKeyFrameX.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.2));
            EKeyFrameX.Value = 0.9;
            dakeyscaleX.KeyFrames.Add(EKeyFrameX);

            //添加一个在第0.3秒的时候ScaleX透明度值为0.9的关键帧
            EKeyFrameX = new EasingDoubleKeyFrame();
            EKeyFrameX.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.25));
            EKeyFrameX.Value = 1.0;
            dakeyscaleX.KeyFrames.Add(EKeyFrameX);

            keyFrameboard.Children.Add(dakeyscaleX);
            #endregion

            #region 后台代码添加DoubleAnimationUsingKeyFrames动画
            DoubleAnimationUsingKeyFrames dakeyscaleY = new DoubleAnimationUsingKeyFrames();
            //设置border矩形控件的ScaleY透明度,并且开始动画事件为0秒的时候。
            Storyboard.SetTarget(dakeyscaleY, contentArea);
            Storyboard.SetTargetProperty(dakeyscaleY, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.ScaleY)"));
            dakeyscaleY.BeginTime = new TimeSpan(0, 0, 0);

            //添加一个在第0秒的时候ScaleX透明度值为0.5的关键帧
            EasingDoubleKeyFrame EKeyFrameY = new EasingDoubleKeyFrame();
            EKeyFrameY.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
            EKeyFrameY.Value = 0.5;
            dakeyscaleY.KeyFrames.Add(EKeyFrameY);

            //添加一个在第0.15秒的时候ScaleX透明度值为1.1的关键帧
            EKeyFrameY = new EasingDoubleKeyFrame();
            EKeyFrameY.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.1));
            EKeyFrameY.Value = 1.1;
            dakeyscaleY.KeyFrames.Add(EKeyFrameY);

            //添加一个在第0.25秒的时候ScaleX透明度值为0.9的关键帧
            EKeyFrameY = new EasingDoubleKeyFrame();
            EKeyFrameY.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.2));
            EKeyFrameY.Value = 0.9;
            dakeyscaleY.KeyFrames.Add(EKeyFrameY);

            //添加一个在第0.3秒的时候ScaleX透明度值为0.9的关键帧
            EKeyFrameY = new EasingDoubleKeyFrame();
            EKeyFrameY.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.25));
            EKeyFrameY.Value = 1.0;
            dakeyscaleY.KeyFrames.Add(EKeyFrameY);

            keyFrameboard.Children.Add(dakeyscaleY);
            #endregion

            return keyFrameboard;
        }
        private Storyboard CloseDialog()
        {
            Storyboard keyFrameboard = new Storyboard();
            keyFrameboard.Completed += new EventHandler(StoryReverse_Completed);

            DoubleAnimation animation = new DoubleAnimation();
            //设置border矩形控件的Opacity透明度,并且开始动画事件为0秒的时候。
            Storyboard.SetTarget(animation, contentArea);
            Storyboard.SetTargetProperty(animation, new PropertyPath("UIElement.Opacity"));

            animation.From = 1; animation.To = 0.1;
            animation.Duration = new Duration(TimeSpan.FromSeconds(0.1));

            keyFrameboard.Children.Add(animation);

            return keyFrameboard;
        }

        private void StoryReverse_Completed(object sender, EventArgs e)
        {
            ClosePopup();
        }

        private void ClosePopup()
        {
            contentArea.Children.Clear();
            _PopupContent = null;
            _BasePage = null;

            Popup parent = this.Parent as Popup;
            if (parent != null)
            {
                parent.IsOpen = false;
            }
        }

        private void mask_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (IsAutoClose)
                Close();
        }

        #endregion

        #region Public Method

        public void Show(FrameworkElement popupContent)
        {
            _PopupContent = popupContent;
            _Popup = new Popup();
            _Popup.Child = this;
            _Popup.IsOpen = true;
        }

        public event PopUpClosed nPopUpClosed;

        public void Close()
        {
            _BasePage.BackKeyPress -= BasePage_BackKeyPress;
            if (storyType == 0) {
                PrepareCloseStory().Begin();
            } else if (storyType == 1) {
                CloseDialog().Begin();
            }
            if (_BasePage.ApplicationBar != null)
                _BasePage.ApplicationBar.IsVisible = true;
            if (nPopUpClosed != null)
                nPopUpClosed();
        }

        #endregion

        public void SetBackgroundColor(Brush aBrush)
        {
            contentArea.Background = aBrush;
        }
    }
}
CustCtrl parm = new CustCtrl();
PopupView pc = new PopupView(this, false, 1);
pc.Height = this.ActualHeight; pc.Width = this.ActualWidth;
SolidColorBrush nBrush = new SolidColorBrush(Color.FromArgb(25, 68, 68, 68));
pc.SetBackgroundColor(nBrush); 
pc.Show(parm);

 

转载于:https://www.cnblogs.com/qq278360339/archive/2013/03/29/2988611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值