概述

在上面一篇 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)
{
    ;
    ;

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

            start = startIndex;
            end = range.UpperBound;
            if (end >= endIndex)
            {
                return true;
            }
        }
        )
        {
            )
            {
                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)
{
    )
    {
        ;
    }

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

    if (front == end)
    {
        range = _list[front];
        if (range.ContainsIndex(index) || (range.UpperBound < index))
        {
            return front;
        }
        else
        {
            ;
        }
    }
    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 !!!

Windows Community Toolkit 4.0 - DataGrid - Part02的更多相关文章

  1. Windows Community Toolkit 4.0 - DataGrid - Part03

    概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part02 中,我们针对 DataGrid 控件的 Utilities 部分做了详细分享.而在 ...

  2. Windows Community Toolkit 4.0 - DataGrid - Part01

    概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Overview 中,我们对 DataGrid 控件做了一个概览的介绍,今天开始我们会做进一步的 ...

  3. Windows Community Toolkit 4.0 - DataGrid - Overview

    概述 Windows Community Toolkit 4.0 于 2018 月 8 月初发布:Windows Community Toolkit 4.0 Release Note. 4.0 版本相 ...

  4. Windows Community Toolkit 3.0 - UniformGrid

    概述 UniformGrid 控件是一个响应式的布局控件,允许把 items 排列在一组均匀分布的行或列中,以填充整体的可用显示空间,形成均匀的多个网格.默认情况下,网格中的每个单元格大小相同. 这是 ...

  5. Windows Community Toolkit 3.0 - InfiniteCanvas

    概述 InfiniteCanvas 是一个 Canvas 控件,它支持无限画布的滚动,支持 Ink,文本,格式文本,画布缩放操作,撤销重做操作,导入和导出数据. 这是一个非常实用的控件,在“来画视频” ...

  6. Windows Community Toolkit 3.0 - Gaze Interaction

    概述 Gaze Input & Tracking - 也就是视觉输入和跟踪,是一种和鼠标/触摸屏输入非常不一样的交互方式,利用人类眼球的识别和眼球方向角度的跟踪,来判断人眼的目标和意图,从而非 ...

  7. Windows Community Toolkit 3.0 - CameraPreview

    概述 Windows Community Toolkit 3.0 于 2018 年 6 月 2 日 Release,同时正式更名为 Windows Community Toolkit,原名为 UWP ...

  8. Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件

    本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...

  9. 与众不同 windows phone (44) - 8.0 位置和地图

    [源码下载] 与众不同 windows phone (44) - 8.0 位置和地图 作者:webabcd 介绍与众不同 windows phone 8.0 之 位置和地图 位置(GPS) - Loc ...

随机推荐

  1. Python 实例方法、类方法、静态方法的区别与作用

    Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义 ...

  2. sqlserver——cube:多维数据集

    1.cube:生成多维数据集,包含各维度可能组合的交叉表格,使用with 关键字连接 with cube 根据需要使用union all 拼接 判断 某一列的null值来自源数据还是 cube 使用G ...

  3. 使用FormData进行Ajax请求上传文件

    Servlet3.0开始提供了一系列的注解来配置Servlet.Filter.Listener等等.这种方式可以极大的简化在开发中大量的xml的配置.从这个版本开始,web.xml可以不再需要,使用相 ...

  4. c/c++ 右值引用

    c/c++ 右值引用 转自:https://www.cnblogs.com/catch/p/3500678.html 左值(lvalue)和右值(rvalue)是 c/c++ 中一个比较晦涩基础的概念 ...

  5. C# -- 索引器、枚举类型

    C# -- 索引器.枚举类型 索引器允许类或结构的实例就像数组一样进行索引. 无需显式指定类型或实例成员,即可设置或检索索引值. 索引器类似于属性,不同之处在于它们的访问器需要使用参数. 1. 索引器 ...

  6. LeetCode算法题-Best Time to Buy and Sell Stock II

    这是悦乐书的第173次更新,第175篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第32题(顺位题号是122).假设有一个数组,其中第i个元素是第i天给定股票的价格.设计 ...

  7. Maven中POM.XML详解

    转自https://blog.csdn.net/jariwsz/article/details/19554137 我们先看一个简单的例子: <project xmlns="http:/ ...

  8. 转 jQuery中的$.extend方法来扩展JSON对象

    $.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...

  9. react中使用Ajax请求(axios,Fetch)

    React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...

  10. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...