专栏首页Windows CommunityWindows Community Toolkit 4.0 - DataGrid - Part02

Windows Community Toolkit 4.0 - DataGrid - Part02

概述

在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我们针对 DataGrid 控件的 CollectionView 部分做了详细分享。而在本篇,我们会对 Utilities 文件夹中的类做详细的分享。

下面是 Windows Community Toolkit Sample App 的示例截图和 code/doc 地址:

Windows Community Toolkit Doc - DataGrid

Windows Community Toolkit Source Code - DataGrid

Namespace: Microsoft.Toolkit.Uwp.UI.Controls; Nuget: Microsoft.Toolkit.Uwp.UI.Controls.DataGrid;

开发过程

首先再来看一下 Utilities 文件夹的代码结构:

可以看到 Utilities 文件夹中的类主要是一些基础和帮助类,下面我们来看一些重要的类代码:

1. DoubleUtil

该类的功能主要是判断两个 double 类型的值之间是否接近,大小关系等;这些方法中用到了一个 AreClose(v1, v2) 的方法,这个方法主要判断两个数值是否相近,计算方法是,当两个值的差,除以两个值的绝对值和加10.0 的值小于 double epsilon 时,认为两个数值是接近的。而 double epsilon 表示大于零的最小 double 数值。

internal const double DBL_EPSILON = 1.1102230246251567e-016;

public static bool AreClose(double value1, double value2)
{
    // in case they are Infinities (then epsilon check does not work)
    if (value1 == value2)
    {
        return true;
    }

    // This computes (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON
    double eps = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * DBL_EPSILON;
    double delta = value1 - value2;
    return -eps < delta && eps > delta;
}

2. Extensions

该类的功能是 DataGrid 控件的扩展,主要有以下扩展方法:

  • IsHandlerSuspended - 处理器暂停的标识;
  • ContainsChild - 遍历可视化树,判断当前控件是否包含某个 child 元素,该方法在 WPF UWP 的很多控件中都有过体现;
  • ContainsFocusedElement - 遍历可视化树,判断当前控件是否包含获得焦点的元素;
  • GetIsReadOnly - 获取控件的只读属性;
  • GetItemType - 获取元素类型,分为枚举和集合两种分类来判断;
  • SetStyleWithType - 设置元素的样式;
  • SetValueNoCallback - 设置值并中断回调;
  • Translate - 计算起始和终止元素间的坐标移动;
  • EnsureMeasured - 在控件被置于背景层时,需要计算尺寸;
  • SuspendHandler - 暂停处理器的处理;

3. IndexToValueTable

该类的功能是 DataGrid 控件的索引和值表之间的处理,我们看几个重要的方法:

1) ContainsAll()

该方法的作用是判断给定的 startIndex 和 endIndex 间的索引范围,是否全部包含在表中;判断过程主要是根据 startIndex 和 endIndex 的值,以及 list 中的每个 range 的 UpperBound 和 LowerBound 的值,判断 startIndex 和 endIndex 是否包含在某个 range 中;

public bool ContainsAll(int startIndex, int endIndex)
{
    int start = -1;
    int end = -1;

    foreach (Range<T> range in _list)
    {
        if (start == -1 && range.UpperBound >= startIndex)
        {
            if (startIndex < range.LowerBound)
            {
                return false;
            }

            start = startIndex;
            end = range.UpperBound;
            if (end >= endIndex)
            {
                return true;
            }
        }
        else if (start != -1)
        {
            if (range.LowerBound > end + 1)
            {
                return false;
            }

            end = range.UpperBound;
            if (end >= endIndex)
            {
                return true;
            }
        }
    }

    return false;
}

2) FindRangeIndex() 

获取当前 range 的索引,计算过程是:遍历 list 中的 range 集合,计算 front 和 end,每次获取中间值,如果 range 的上下限包含该 index,返回该 index;否则,根据 front 和 end 的对比,计算值作为索引返回;

private int FindRangeIndex(int index)
{
    if (_list.Count == 0)
    {
        return -1;
    }

    int front = 0;
    int end = _list.Count - 1;
    Range<T> range = null;
    while (end > front)
    {
        int median = (front + end) / 2;
        range = _list[median];
        if (range.UpperBound < index)
        {
            front = median + 1;
        }
        else if (range.LowerBound > index)
        {
            end = median - 1;
        }
        else
        {
            return median;
        }
    }

    if (front == end)
    {
        range = _list[front];
        if (range.ContainsIndex(index) || (range.UpperBound < index))
        {
            return front;
        }
        else
        {
            return front - 1;
        }
    }
    else
    {
        return end;
    }
}

4. TypeHelper

该类是 DataGrid 控件的类型帮助类,主要功能是获取类型,属性信息,显示名等信息。这些方法都是较通用的方法,大家如果有兴趣,可以去详细查看代码,这里不做赘述。

5. ValidationUtil

该类的主要功能是 dataGrid 控件的校验,我们来看看 FindEqualValidationResult 方法:

public static ValidationResult FindEqualValidationResult(this ICollection<ValidationResult> collection, ValidationResult target)
{
    foreach (ValidationResult oldValidationResult in collection)
    {
        if (oldValidationResult.ErrorMessage == target.ErrorMessage)
        {
            bool movedOld = true;
            bool movedTarget = true;
            IEnumerator<string> oldEnumerator = oldValidationResult.MemberNames.GetEnumerator();
            IEnumerator<string> targetEnumerator = target.MemberNames.GetEnumerator();
            while (movedOld && movedTarget)
            {
                movedOld = oldEnumerator.MoveNext();
                movedTarget = targetEnumerator.MoveNext();

                if (!movedOld && !movedTarget)
                {
                    return oldValidationResult;
                }

                if (movedOld != movedTarget || oldEnumerator.Current != targetEnumerator.Current)
                {
                    break;
                }
            }
        }
    }

    return null;
}

6. VisualStates

该类是 DataGrid 控件的可视化状态类,主要分类一下几种状态组:

  • Common - Normal,PointerOver,Pressed,Disabled
  • Expanded - Expanded,Collapsed,Empty
  • Focus - Unfocused,Focused
  • Selection - Selected,Unselected
  • Active - Active,Inactive
  • Current - Regular,Current,CurrentWithFocus
  • Interaction - Display,Editing
  • Sort - Unsorted,SortAscending,SortDescending
  • Validation - Invalid,RowInvalid,RowValid,Valid
  • ScrollBarsSeparator - SeparatorExpanded,SeparatorCollapsed,SeparatorExpandedWithoutAnimation,SeparatorCollapsedWithoutAnimation
  • ScrollBars - TouchIndicator,MouseIndicator,MouseIndicatorFull,NoIndicator

总结

这里我们把 DataGrid 的 Utilities 相关类介绍完成了,作为 DataGrid 相关分享的第二篇,后面我们会继续分享最重要的 DataGrid 的相关重点。

最后,再跟大家安利一下 WindowsCommunityToolkit 的官方微博:https://weibo.com/u/6506046490大家可以通过微博关注最新动态。

衷心感谢 WindowsCommunityToolkit 的作者们杰出的工作,感谢每一位贡献者,Thank you so much, ALL WindowsCommunityToolkit AUTHORS !!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 共享单车落幕:上海凤凰诉ofo或在情理之中

    共享单车浩浩荡荡的发展历程伴随着资本的退却而最终落幕。尽管共享单车市场上摩拜投身美团总算是有了一个好归宿,哈罗单车对于三四线的深度布局实现了逆袭,ofo依然在仗...

    孟永辉
  • 拼多多、趣头条上市,反驳消费升级的无效样本

    最近,有关消费升级与消费降级的讨论一直都没有停止过。作为一个新的风口和方向,人们对于消费升级和消费降级的谈论无可厚非,因为只有深入讨论才能找到合适的发展方向。但...

    孟永辉
  • 锤子手机推“无限屏”新机:让我们为老罗的创新点赞

    人们对于锤子手机的发布会的期待其实更多的是在看罗永浩的“单口相声”。无论锤子手机如何,观众依然能够在锤子手机发布会上过一回嘴瘾。罗永浩对于自己,对于友商,对于行...

    孟永辉
  • 或许,9月12日的苹果新品发布会依然会让人失望!

    正如每一次的苹果邀请函都带给我们不一样的感受一样,今年9月12日的苹果发布会的邀请函依然让我们浮想联翩。这或许是苹果以往营销套路的延续——通过给人一个极具想象力...

    孟永辉
  • BAT、TMD加持新技术背景下,互联网家装如何蝶变新生?

    几乎所有的“互联网+”模式都存在同样的问题,那就是对于行业内在运行逻辑改造的无力与浅层。互联网家装同样如此。我们看到,尽管互联网家装改变了人们获取用户的方式和手...

    孟永辉
  • 任性的苹果,任性的库克

    或许在人类历史上还没有哪一个科技公司会像苹果般任性,任性到可以不顾及用户的感受。随着苹果发布会的新鲜“上线”,我们再次见识到了苹果的任性。价格再度刷新史上最高、...

    孟永辉
  • 1万步21天钉钉运动大神赛

      目前所在的企业,从入职开始到现在,内部沟通协作的主要软件也就是钉钉。三月初的时候,偶然在钉钉运动一栏中发现了这个活动,当时也没怎么犹豫,果断支付了2元契约金...

    happyJared
  • 马云退休,一个全新的互联网时代或将开始

    今天,马云退休的消息无疑是一个焦点。对于马云退休的原因,外界依然有很多的猜测。几乎可以确定的是,未来马云将会从事自己心仪的教育事业,并将会持续发挥自己在教育事业...

    孟永辉
  • 饿了么并入口碑,一场“非典型”新零售大战的开始

    如果你了解互联网巨头的套路,你就会发现他们会不断用资本的力量去拓展自己的势力范围,并且建构一个能够将人们所有的生活场景全部都囊括其中的生态体系。饿了么并入口碑仅...

    孟永辉
  • 恒大入主法拉第,FF91真的要来了吗?

    自恒大入主法拉第之后,FF91落地的步伐似乎开始逐步加快。在许家印到法拉第公司考察之后,FF91在落地到中国的步伐更加快速。就在上周,恒大法拉第未来智能汽车集团...

    孟永辉

扫码关注云+社区

领取腾讯云代金券