zoukankan      html  css  js  c++  java
  • WindowsPhone模拟简易Toast弹出框

    Coding4Fun这个开源控件中有ToastPrompt这个弹出框组件,但是由于Coding4Fun太庞大,如果只用到ToastPrompt这个控件的话,整个引用不太值当的。于是自己写了一个差不多的简易Toast,如果需要其他功能可以酌情添加。包含向右滑动取消弹出的功能。

    考虑用Popup弹出框,首先定义一个弹出的UserControl,包含一个Message文本框和弹出结束的对应动画:

    <UserControl x:Name="userControl" x:Class="Toast.ToastBox"
        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"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        Width="480" Height="62">
    	<UserControl.Resources>
    		<Storyboard x:Name="Open">
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.GlobalOffsetX)" Storyboard.TargetName="userControl">
    				<EasingDoubleKeyFrame KeyTime="0" Value="-480"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/>
    			</DoubleAnimationUsingKeyFrames>
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="userControl">
    				<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/>
    			</DoubleAnimationUsingKeyFrames>
    		</Storyboard>
    		<Storyboard x:Name="Close">
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="userControl">
    				<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/>
    			</DoubleAnimationUsingKeyFrames>
    			<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.GlobalOffsetX)" Storyboard.TargetName="userControl">
    				<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
    				<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="480"/>
    			</DoubleAnimationUsingKeyFrames>
    		</Storyboard>
    	</UserControl.Resources>
    	<UserControl.Projection>
    		<PlaneProjection/>
    	</UserControl.Projection>
        
        <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneAccentBrush}">
            <TextBlock x:Name="message" Text="" FontFamily="DengXian" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="30,30,0,0"/>
        </Grid>
    </UserControl>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    
    namespace Toast
    {
        public partial class ToastBox : UserControl
        {
            public ToastBox()
            {
                InitializeComponent();
            }
    
            public static readonly DependencyProperty MessageProperty
                = DependencyProperty.Register("Message", typeof(string), typeof(ToastBox), new PropertyMetadata(OnMessageChanged));
            private static void OnMessageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (d != null && d is ToastBox)
                {
                    (d as ToastBox).SetMessage((string)e.NewValue);
                }
            }
            private void SetMessage(string toastBox)
            {
                message.Text = toastBox;
            }
            public string Message
            {
                get
                {
                    return (string)GetValue(MessageProperty);
                }
                set
                {
                    SetValue(MessageProperty, value);
                }
            }
        }
    }

    然后新建一个ToastPrompt类:

    namespace Toast
    {
        public class ToastPrompt
        {
            public event EventHandler Click;
            public event EventHandler Completed;
     
            public void Show(string message)
            {
                try
                {
                    Popup p = new Popup();
                    ToastBox tb = new ToastBox() { Message = message };
                    p.Child = tb;
                    p.IsOpen = true;
                    tb.Open.Begin();
                    DispatcherTimer timer = new DispatcherTimer();
                    tb.Open.Completed += new EventHandler((sender, eventargs) =>
                    {
                        try
                        {
                            timer.Interval = TimeSpan.FromSeconds(3);
                            timer.Tick += new EventHandler((sd, ea) =>
                            {
                                try
                                {
                                    if (timer != null && timer.IsEnabled)
                                    {
                                        timer.Stop();
                                        tb.Close.Begin();
                                        tb.Close.Completed += new EventHandler((s, e) =>
                                        {
                                            try
                                            {
                                                p.IsOpen = false;
                                                if (Completed != null)
                                                    Completed.Invoke(this, new EventArgs());
                                            }
                                            catch { }
                                        });
                                    }
                                }
                                catch { }
                            });
                            timer.Start();
                        }
                        catch { }
                    });
                    tb.Tap += new EventHandler<GestureEventArgs>((sender, eventargs) =>
                    {
                        try
                        {
                            if (Click != null)
                                Click.Invoke(this, new EventArgs());
                        }
                        catch { }
                    });
                    tb.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>((sender, eventargs) =>
                    {
                        try
                        {
                            if (eventargs.TotalManipulation.Translation.X > 200 || eventargs.FinalVelocities.LinearVelocity.X > 1000)
                            {
                                if (timer != null && timer.IsEnabled)
                                {
                                    timer.Stop();
                                    tb.Close.Begin();
                                    tb.Close.Completed += new EventHandler((sd, ea) =>
                                    {
                                        try
                                        {
                                            p.IsOpen = false;
                                            if (Completed != null)
                                                Completed.Invoke(this, new EventArgs());
                                        }
                                        catch { }
                                    });
                                }
                            }
                        }
                        catch { }
                    });
                }
                catch { }
            }
        }
    }

    至此,一个简易的Toast弹出框就成功了,可以用如下方式调用:

    var toast = new ToastPrompt();
    toast.Show("再按一次退出程序~~~");

    Toast还有相应的Completed和Click的事件处理~~~

    详情移步我的博客:http://blog.liubaicai.com/?p=250

  • 相关阅读:
    KMP
    图论知识,博客
    POJ 2318/2398 叉积性质
    CF821 E. Okabe and El Psy Kongroo 矩阵快速幂
    CF821 D. Okabe and City 图 最短路
    CF821 C. Okabe and Boxes 栈模拟
    CF821 A. Okabe and Future Gadget Laboratory 水
    Atcoder arc077 D
    Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈
    Atcoder #017 agc017 B.Moderate Differences 思维
  • 原文地址:https://www.cnblogs.com/liubaicai/p/3511170.html
Copyright © 2011-2022 走看看