曾经在WP7、WP8下的消息 使用的都是Coding4Fun.Phone.Toolkit里面的ToastPrompt类来实现的。

现在我们来自己做个类似IT之家的这种效果:从右边弹出,经过几秒后会自动消失。

首先明确几个需求:

1.在任何界面都能够弹出此消息

2.可以自定义消息的格式内容以及消息的消失时间

(包括是否含有标题、字体大小、排列...)

3.消息的提示与消失都有动画效果

一、取得当前页面上的某个Panel, 用于在此上面呈现消息:

ContentPresenter、Panel都是继承于 FrameWorkElement的

ContentPresenter: 只能容纳一个元素

继承于Panel 的控件是可以容纳多个子控件的,所以将消息显示在这个上面

        Panel popUpParentPanel; //消息在此Panel上弹出
Frame RootVisualFrame; //当前页面的可视根 public Panel PopUpParentPanel
{
get
{
if (popUpParentPanel == null)
{
IEnumerable<ContentPresenter> source = CommonHelper.GetVisualDescendants(this.RootVisualFrame).OfType<ContentPresenter>();  //获取所有ContentPresenter类型的子对象
for (int i = ; i < source.Count<ContentPresenter>(); i++)
{
IEnumerable<Panel> enumerable2 = CommonHelper.GetVisualDescendants(source.ElementAt<ContentPresenter>(i)).OfType<Panel>();  //获取所有Panel类型的子对象
if (enumerable2.Count<Panel>() > )
{
this.popUpParentPanel = enumerable2.First<Panel>();  //选出第一个Panel
break;
}
}
}
return this.popUpParentPanel;
}
}

二、展示Show方法:

        bool bLocked;    //默认为false

        public void Show()
{
if (bLocked)
{
return;
}
InitControl(); //有关消息界面的代码略,详细请看后文给出的Demo
if (PopUpParentPanel != null)
{
//添加消息至Panel
if (PopUpParentPanel is StackPanel)
{
PopUpParentPanel.Children.Insert(, toastGrid);
}
else
{
PopUpParentPanel.Children.Add(toastGrid);
}
ShowStoryboard(); //开启动画
bLocked = true;
}
}

获取子元素相关静态类:

    public class CommonHelper
{
public static IEnumerable<DependencyObject> GetVisualChildren(DependencyObject element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
return GetVisualChildrenAndSelfIterator(element).Skip<DependencyObject>();
} public static IEnumerable<DependencyObject> GetVisualDescendants(DependencyObject element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
return GetVisualDescendantsAndSelfIterator(element).Skip<DependencyObject>(); //去除元素本身
} private static IEnumerable<DependencyObject> GetVisualDescendantsAndSelfIterator(DependencyObject element)
{
Queue<DependencyObject> iteratorVariable0 = new Queue<DependencyObject>();
iteratorVariable0.Enqueue(element);
while (true)
{
if (iteratorVariable0.Count <= )
{
yield break;
}
DependencyObject iteratorVariable1 = iteratorVariable0.Dequeue();
yield return iteratorVariable1;
foreach (DependencyObject obj2 in GetVisualChildren(iteratorVariable1))
{
iteratorVariable0.Enqueue(obj2);
}
}
} private static IEnumerable<DependencyObject> GetVisualChildrenAndSelfIterator(DependencyObject element)
{
yield return element;
int childrenCount = VisualTreeHelper.GetChildrenCount(element);
int childIndex = ;
while (true)
{
if (childIndex >= childrenCount)
{
yield break;
}
yield return VisualTreeHelper.GetChild(element, childIndex);
childIndex++;
}
}
}

三、显示消息动画效果以及添加消息显示完成事件:

 public event EventHandler<object> ToastShowComplated;  //消息显示完成事件   

 public void ShowStoryboard()
{
Storyboard sbShow = new Storyboard();
sbShow.Completed += sbShow_Completed;  //动画完成后开始计时,时间到后消息消失 //X轴方,向从消息界面一半处开始
DoubleAnimation da = new DoubleAnimation() { From = toastGrid.Width / , To = , Duration = dua };
da.EasingFunction = new CircleEase() { EasingMode = EasingMode.EaseOut };
Storyboard.SetTarget(da, toastTransform);
Storyboard.SetTargetProperty(da, "TranslateTransform.X"); //绑定目标属性和以前有些区别
sbShow.Children.Add(da); //设置透明度从0变为1
DoubleAnimation da1 = new DoubleAnimation() { From = , To = , Duration = dua };
Storyboard.SetTarget(da1, toastGrid);
Storyboard.SetTargetProperty(da1, "FrameworkElement.Opacity");
sbShow.Children.Add(da1); sbShow.Begin(); //开始动画
}
void sbShow_Completed(object sender, object e)
{
IsShow = true;
       //计时器开始
timer = new Timer(new TimerCallback(Time_Completed), null, this.TotalHiddenSeconds * , );
if (this.ToastShowComplated != null)
{
ToastShowComplated(this, e);
}
} async void Time_Completed(object e)
{
timer.Dispose();
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
HideStoryboard();
});
}

隐藏消息动画以及添加消息隐藏完成事件一样的。

四、使用该自定义消息:

private void btnToast_Click(object sender, RoutedEventArgs e)
{
CustomToast toast = new CustomToast() { Message = "这是展示的内容!" };
toast.Show();
}

右边是本篇随笔的Demo:CustomToastSample.rar

【WP8.1】类似“IT之家” 自定义消息 的实现的更多相关文章

  1. ghoest32 不重启电脑手动备份系统为.gho

    备份系统我们一般使用DOS之家的ghoest备份工具,但备份必须是重启电脑在DOS命令行下,其实,可以不重启电脑备份系统,也就是手动备份系统.DOS之家用的ghoest本质也是赛门铁克公司出的ghoe ...

  2. 【UWP】对 Thickness 类型属性进行动画

    好几个月没写 blog 了,一个是在忙新版的碧影壁纸,另一方面是等(观望)周年更新的 api(不过现在还是比较失望,仍然没法支持矩形以外的 Clip).闲话少说,进入主题. 在 UWP 中,出于性能考 ...

  3. 【Win10】页面导航的实现

    注:本文基于 Windows 10 10240 及其 SDK 编写,若以后有变化,请以新版本为准. 页面导航我们是再熟悉不过了,浏览器.手机 App 大多都使用这种方式来展示内容.在 Windows ...

  4. 不建议用wxWidgets,底层有过多的bug

    不建议用wxWidgets, 搞了wxWidgets 3年,不是所说的那么容易跨平台,很多bug,不稳定, 莫名其妙的崩溃找源代码修改编译真是费时费力. 开发速度真没有使用本地sdk开发高, 很难定制 ...

  5. 网页静态化技术--Freemarker入门

    网页静态化技术:为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说,至少几百万个商品,每个商品又 ...

  6. Ionic实战三:Ionic 图片预览可放大缩小左右滑动demo-iClub图片预览

    这个demo的主要功能有两个,一个是首页的导航向上拉动会浮动在最上面的效果,另一个就是我们平时非常实用的功能,就是图片预览功能 点击可以放大图片,并且可以左右滑动,还可以双击放大缩小图片以及双手指控制 ...

  7. Neo4j中实现自定义中文全文索引

    数据库检索效率时,一般首要优化途径是从索引入手,然后根据需求再考虑更复杂的负载均衡.读写分离和分布式水平/垂直分库/表等手段:索引通过信息冗余来提高检索效率,其以空间换时间并会降低数据写入的效率:因此 ...

  8. 磁力搜索网站 BT torrent search engine 推荐 2019/12/25日更新

    btkitty 知名的BT磁力搜索,资源很多,中文友好 btdb 知名的BT磁力搜索,资源很多,中文友好 838888 不错的 BT 磁力搜索引擎,资源很多,中文友好 idope.se 资源丰富的BT ...

  9. 核心思想:许多公司都没有认识到云储存的革命性(类似QQ把它搞成了用户的家、再也离不开了)

    在云储存刚刚兴起的时候,也就是dropbox刚刚进入大家视野的时候.许多人都是简单的认为这只是一个提供在线存储的服务而已,许多公司都没有认识到云储存的革命性. 对于这些大公司贸然进入一些新的领域是需要 ...

随机推荐

  1. gdb 基本知识

    一 单步执行和跟踪函数调用 先给出一段代码,可以用下面介绍的例子. #include <stdio.h> int add_range(int low, int high) { int i, ...

  2. socket Bio demo

    最近在做socket通信,最开始是基于Bio开发(其实开发的时候也不知道这种是基于BIO).但是问题来了,客户端发的报文,服务端接收会少,为了解决问题,只能恶补一下相关知识. 服务端: import ...

  3. 【less】Bootstrap / Less 学习

    我是借助的 考拉 来编译LESS~~ http://www.openkoala.org/download.html 官网 less 提供的主要功能 1.变量个人觉得,变量是 Less 最重要的功能.举 ...

  4. [No000083]文件与文件夹操作

    #region Folder option 文件夹操作 /// <summary> /// 指定目录是否存在 /// </summary> /// <param name ...

  5. C#通过属性名称获取(读取)属性值的方法

    之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...

  6. ActiveMQ笔记(4):搭建Broker集群(cluster)

    上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候 ...

  7. [LeetCode] Search for a Range 搜索一个范围

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  8. 当AngularJS POST方法碰上PHP

    问题描述 怎么POST过去给PHP都收不到资料? $_POST方法取不到正确的传入值! 原理说明 AngularJS这套framework使用的AJAX方法中,资料传递的格式为JSON,送出去的hea ...

  9. Snowflake 全局唯一Id 生成

    /// <summary> /// From: https://github.com/twitter/snowflake /// An object that generates IDs. ...

  10. JavaScript值类型与执行环境和垃圾处理机制

    JavaScript变量分为基本值类型和引用值类型,基本值类型就是以下这五种:Boolean,Number,String,Null,Undefined.基本值类型和引用值类型具有以下特点: 1.基本值 ...