日期:2014-05-17 浏览次数:20865 次
在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验证一下。
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Input; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍 namespace Test { /// <summary> /// 可用于自身或导航至 Frame 内部的空白页。 /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); this.PointerPressed += ((sender, e) => { var p = e.GetCurrentPoint(this); var currentPoint = p; var start = DateTime.Now.Millisecond; var x = Convert.ToInt32(p.Position.X); foreach (var item in testDict. Where(o => { return Task<bool>.Run(() => { return o.Key(x); }).Result; })) { item.Value(); } var end = DateTime.Now.Millisecond; Debug.WriteLine(start); Debug.WriteLine(end); Debug.WriteLine("时差:" + (start - end).ToString()); }); } Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>(); /// <summary> /// 在此页将要在 Frame 中显示时进行调用。 /// </summary> /// <param name="e">描述如何访问此页的事件数据。Parameter /// 属性通常用于配置页。</param> protected override void OnNavigatedTo(NavigationEventArgs e) { Predicate<int> pp = CheckPointer; testDict.Add(CheckPointer, async () => { await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => { TextBlock tb = new TextBlock(); tb.Text = "打印"; lv.Items.Add(tb); }); }); } public static bool CheckPointer(int p) { for (int i = 9999999; i > 0; i--) { if (i == p) { return true; } } return false; } private void Button_Click_1(object sender, RoutedEventArgs e) { } } }