日期:2014-05-17  浏览次数:20865 次

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

在Winrt中 高性能处理多个条件语句

    在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)
        {

        }
    }
}