经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Windows Community Toolkit 4.0 - DataGrid - Part02
来源:cnblogs  作者:shaomeng  时间:2018/9/25 20:39:54  对本文有异议

概述

在上面一篇 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 数值。

  1. internal const double DBL_EPSILON = 1.1102230246251567e-016;

    public
    static bool AreClose(double value1, double value2)
  2. {
  3. // in case they are Infinities (then epsilon check does not work)
  4. if (value1 == value2)
  5. {
  6. return true;
  7. }
  8. // This computes (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON
  9. double eps = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * DBL_EPSILON;
  10. double delta = value1 - value2;
  11. return -eps < delta && eps > delta;
  12. }

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 中;

  1. public bool ContainsAll(int startIndex, int endIndex)
  2. {
  3. int start = -1;
  4. int end = -1;
  5. foreach (Range<T> range in _list)
  6. {
  7. if (start == -1 && range.UpperBound >= startIndex)
  8. {
  9. if (startIndex < range.LowerBound)
  10. {
  11. return false;
  12. }
  13. start = startIndex;
  14. end = range.UpperBound;
  15. if (end >= endIndex)
  16. {
  17. return true;
  18. }
  19. }
  20. else if (start != -1)
  21. {
  22. if (range.LowerBound > end + 1)
  23. {
  24. return false;
  25. }
  26. end = range.UpperBound;
  27. if (end >= endIndex)
  28. {
  29. return true;
  30. }
  31. }
  32. }
  33. return false;
  34. }

2) FindRangeIndex() 

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

  1. private int FindRangeIndex(int index)
  2. {
  3. if (_list.Count == 0)
  4. {
  5. return -1;
  6. }
  7. int front = 0;
  8. int end = _list.Count - 1;
  9. Range<T> range = null;
  10. while (end > front)
  11. {
  12. int median = (front + end) / 2;
  13. range = _list[median];
  14. if (range.UpperBound < index)
  15. {
  16. front = median + 1;
  17. }
  18. else if (range.LowerBound > index)
  19. {
  20. end = median - 1;
  21. }
  22. else
  23. {
  24. return median;
  25. }
  26. }
  27. if (front == end)
  28. {
  29. range = _list[front];
  30. if (range.ContainsIndex(index) || (range.UpperBound < index))
  31. {
  32. return front;
  33. }
  34. else
  35. {
  36. return front - 1;
  37. }
  38. }
  39. else
  40. {
  41. return end;
  42. }
  43. }

4. TypeHelper

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

5. ValidationUtil

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

  1. public static ValidationResult FindEqualValidationResult(this ICollection<ValidationResult> collection, ValidationResult target)
  2. {
  3. foreach (ValidationResult oldValidationResult in collection)
  4. {
  5. if (oldValidationResult.ErrorMessage == target.ErrorMessage)
  6. {
  7. bool movedOld = true;
  8. bool movedTarget = true;
  9. IEnumerator<string> oldEnumerator = oldValidationResult.MemberNames.GetEnumerator();
  10. IEnumerator<string> targetEnumerator = target.MemberNames.GetEnumerator();
  11. while (movedOld && movedTarget)
  12. {
  13. movedOld = oldEnumerator.MoveNext();
  14. movedTarget = targetEnumerator.MoveNext();
  15. if (!movedOld && !movedTarget)
  16. {
  17. return oldValidationResult;
  18. }
  19. if (movedOld != movedTarget || oldEnumerator.Current != targetEnumerator.Current)
  20. {
  21. break;
  22. }
  23. }
  24. }
  25. }
  26. return null;
  27. }

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 !!!

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号