http://blog.csdn.net/wangrenzhu2011/article/details/8578806 (转)

在winrt中 多点触控 控件的应用越来越多,例如 各种手势与 控件之间的互动,如常规的:放大缩小,滑动,旋转,轻扫等。。

但是如果我们需要自定义一些手势,那么需要大量的条件语句判断,严重的影响了性能,往往这些判断在ui 中计算,当触控点过多时会引起系统内响应过慢。

当然 常规的解决办法是将这些条件判断放置在多线程中处理。但是该方式治标不治本,条件过多时,代码会显得非常混乱 难以维护。。

下面我将介绍一种比较合理的方式处理该问题。

通过Predict定义多个条件,通过Action或者Func 来实现判断之后的效果。

Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>();

或者Dictionary<Predicate<int>, Task<Action>> testDict = new Dictionary<Predicate<int>, Task<Action>>();

Dictionary<Predicate<int>, Func<int>> testDict = new Dictionary<Predicate<int>, Func<int>>();

我们以第一个testDict 写一个sample验证一下。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Windows.Foundation;
  8. using Windows.Foundation.Collections;
  9. using Windows.UI.Input;
  10. using Windows.UI.Xaml;
  11. using Windows.UI.Xaml.Controls;
  12. using Windows.UI.Xaml.Controls.Primitives;
  13. using Windows.UI.Xaml.Data;
  14. using Windows.UI.Xaml.Input;
  15. using Windows.UI.Xaml.Media;
  16. using Windows.UI.Xaml.Navigation;
  17. // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
  18. namespace Test
  19. {
  20. /// <summary>
  21. /// 可用于自身或导航至 Frame 内部的空白页。
  22. /// </summary>
  23. public sealed partial class MainPage : Page
  24. {
  25. public MainPage()
  26. {
  27. this.InitializeComponent();
  28. this.PointerPressed += ((sender, e) =>
  29. {
  30. var p = e.GetCurrentPoint(this);
  31. var currentPoint = p;
  32. var start = DateTime.Now.Millisecond;
  33. var x = Convert.ToInt32(p.Position.X);
  34. foreach (var item in testDict.
  35. Where(o =>
  36. {
  37. return Task<bool>.Run(() =>
  38. {
  39. return o.Key(x);
  40. }).Result;
  41. }))
  42. {
  43. item.Value();
  44. }
  45. var end = DateTime.Now.Millisecond;
  46. Debug.WriteLine(start);
  47. Debug.WriteLine(end);
  48. Debug.WriteLine("时差:" + (start - end).ToString());
  49. });
  50. }
  51. Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>();
  52. /// <summary>
  53. /// 在此页将要在 Frame 中显示时进行调用。
  54. /// </summary>
  55. /// <param name="e">描述如何访问此页的事件数据。Parameter
  56. /// 属性通常用于配置页。</param>
  57. protected override void OnNavigatedTo(NavigationEventArgs e)
  58. {
  59. Predicate<int> pp = CheckPointer;
  60. testDict.Add(CheckPointer, async () =>
  61. {
  62. await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
  63. {
  64. TextBlock tb = new TextBlock();
  65. tb.Text = "打印";
  66. lv.Items.Add(tb);
  67. });
  68. });
  69. }
  70. public static bool CheckPointer(int p)
  71. {
  72. for (int i = 9999999; i > 0; i--)
  73. {
  74. if (i == p)
  75. {
  76. return true;
  77. }
  78. }
  79. return false;
  80. }
  81. private void Button_Click_1(object sender, RoutedEventArgs e)
  82. {
  83. }
  84. }
  85. }
  1. <Page
  2. x:Class="Test.MainPage"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:Test"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9. <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  10. <Button Content="Button" HorizontalAlignment="Left" Margin="496,61,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
  11. <ListView x:Name="lv" HorizontalAlignment="Left" Height="558" Margin="973,43,0,0" VerticalAlignment="Top" Width="256"/>
  12. </Grid>
  13. </Page>

这个例子非常的简单,在page上触发点击操作之后将会触发predict中的条件判断

循环999999次 计算量较多,如果在ui线程中直接运行该判断将会造成ui卡死,

但是通过predict 的线程中处理之后 可以快速响应 结果,并将打印输出到listview中

当然 我们可以添加多个 predict 条件 以及相应的Action结果  来响应不同的触控,来实现各种自定义手势。

每一种手势将使用一个单独的predict  和相应的Action ,这么做的好处是 将 各种判断抽象化 为工厂模式,方便后期维护,以及2次开发。

我们可以通过程序初始化的时候 配合数据库 在Dictionary里 增加不同的predict 和不同的Action 来完成 配置化。

大家可以通过该模式 扩展,用于多点识别manipulation 或者其他方向。

以上 介绍到此

在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势的更多相关文章

  1. Yii数据库子查询嵌入select中,而不是where条件语句中

    $subQuery = (new Query())->select('COUNT(*)')->from('user'); // SELECT `id`, (SELECT COUNT(*) ...

  2. 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)

    原文:将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本) 如果你要在 WPF 程序中使用线程池完成一个特殊的任务,那么使用 .NET 的 API Task.Run 并传入一个 L ...

  3. JOIN关联表中ON,WHERE后面跟条件的区别

    select * from td  left join (select case_id as sup_case_id , count(*) supervise_number from  td_kcdc ...

  4. WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法

    文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...

  5. java中的条件语句(if、if...else、多重if、嵌套if)

    Java条件语句之 if 生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S .对于这种"需要先判断条件,条件满足后才 ...

  6. postgres中几个复杂的sql语句

    postgres中几个复杂的sql语句 需求一 需要获取一个问题列表,这个问题列表的排序方式是分为两个部分,第一部分是一个已有的数组[0,579489,579482,579453,561983,561 ...

  7. C#中使用Sql对Excel条件查询

    如何在C#中实现对Excel的条件查询呢? 在使用Sql条件语句对Excel进行查询时,遇到"至少一个参数没有被指定值"的问题,如何解决? 使用OleDbConnection对象创 ...

  8. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  9. js中的条件语句

    //js中的条件语句 ; //example1 单分支语句 ){ console.log("你已经不年轻了!"); }else{ console.log("你依然很有活力 ...

随机推荐

  1. sql注入之你问我答小知识

    /*每日更新,珍惜少年时博客*/ 1.问:为啥order by 是排序.而在注入当中后面加的却不是字段而是数字捏? 答:第N个字段嘛.order by 5就是第五个字段,如果5存在,6不存在.就说明只 ...

  2. 关于C语言的printf输出问题

    前端面试的时候老总居然问这个问题,有点震惊…… #include <stdio.h> #include <stdlib.h> void main() { ; printf(&q ...

  3. ntpdate公司测试

    [root@i158 ~]# ntpdate -u time.uuwatch.com 9 Jul 11:18:50 ntpdate[853]: no server suitable for synch ...

  4. js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)

    通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识.看个例子:<input type="button" name=&qu ...

  5. Adobe Flash Player 因过期而遭到阻止 更新插件 运行一次 解决方法

    老机器运行 10.3.183.90 比较流畅 可是 Chrome 浏览器提示 Adobe Flash Player 因过期而遭到阻止 更新插件 运行一次 每次单击 运行一次 才运行,这样每次提醒很烦人 ...

  6. 1.django笔记之django基础

    一.django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...

  7. Heap:Moo University - Financial Aid(POJ 2010)

       牛的学校 题目大意:这只Bessie真是太顽皮了,她又搞了个学校,准备招生,准备通过一个考试筛选考生,但是不能招到每个学生,每个学生也不能一定能上学,要资助,问你在一定资金内,怎么收学生,使收到 ...

  8. HttpClient实现客户端与服务器的通信

    本篇主要讲解了利用HttpClient实现 windows主机与linux服务器的通信与传递数据 HttpClient代码,服务器端配置 系统和安装软件 1)ubuntu 14.04 64位系统 2) ...

  9. 解决TIME_WAIT过多造成的问题

    sh-4.1# netstat -an |awk '/tcp/ {++S[$NF]}END {for (a in S) print a , S[a]}' TIME_WAIT CLOSE_WAIT ES ...

  10. 菜鸟学Linux命令:chmod命令和数字文件权限

    chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数.只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权限 ...