Windows Community Toolkit 4.0

來源:互聯網
上載者:User

概述

在上面一篇 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 的官方微博:weibo.com/u/6506046490, 大家可以通過微博關注最新動向。

衷心感謝 WindowsCommunityToolkit 的作者們傑出的工作,感謝每一位貢獻者,Thank you so much, ALL WindowsCommunityToolkit AUTHORS !!!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.