[C1] 優化 C1FlexGrid 單元格邊框


一  優化理由

如下圖所示,如果按照 C1FlexGrid 自帶的單元格邊框設置,即對每個單元格的 CellStyle 的 BorderThickness 進行設置,會得到如下圖的效果:

image

其中,明顯可以看到如果兩個相鄰的單元格同時設置了那條相鄰的邊,則會看起來很粗……原因很簡單,C1FlexGrid是在 Grid 的基礎上擴展,並且對每個單元格的繪制都是通過嵌套一層 Border 處理的,然后樓主就閑着 dt 自己用 Grid 模擬了一個簡單的 C1FlexGrid 表格,然后用 Border 嵌套放入,設置了一下 Border 的邊框,效果一模一樣啊,重疊部分都變粗了;還有一個問題就是,C1FlexGrid 可以設置 GridLinesBrush 屬性,來顯示默認的條條框框的顯示(即時未設置單元格邊框),如圖中的灰色線條。但是問題來了,如圖中(1,0,0,0)單元格設置,右側和下方的默認線條沒了,偶雖然不想要該單元格右邊框和下邊框,但你也不能把默認的條條框框的線條給弄沒了啊……

這對於處女座的樓主來說,簡直是不可容忍的缺陷啊,於是樓主就參照 C1FlexGrid 的 Demo 工程 ExcelBook 5.0 做了自己的優化處理,並將該優化應用到一直在持續完善的 仿Excel擴展C1FlexGrid控件 中去。

二  優化思路

在 Demo——ExcelBook 5.0 中有如下一段代碼,可以看出來,它們在每個單元格的內容外圍嵌套了四層 Border,分別來繪制單元格的上、下、左、右邊框及其顏色:

  1 // ** overrides
  2 public override void Apply(Border bdr, SelectedState selState)
  3 {
  4     base.Apply(bdr, SelectedState.None)
  5     ApplyBorder(bdr, _bdrLeft, new Thickness(_bdrThickness.Left, 0, 0, 0))
  6     ApplyBorder(bdr, _bdrTop, new Thickness(0, _bdrThickness.Top, 0, 0))
  7     ApplyBorder(bdr, _bdrRight, new Thickness(0, 0, _bdrThickness.Right, 0))
  8     ApplyBorder(bdr, _bdrBottom, new Thickness(0, 0, 0, _bdrThickness.Bottom))
  9 }
 10 void ApplyBorder(Border bdr, Brush br, Thickness t)
 11 {
 12     if (br != null && t != _thicknessEmpty)
 13     {
 14         // create inner border
 15         var inner = new Border()
 16         inner.BorderThickness = t
 17         inner.BorderBrush = br
 18 
 19         // transfer content
 20         var content = bdr.Child
 21         bdr.Child = inner
 22         inner.Child = content
 23 
 24         // transfer padding
 25         inner.Padding = bdr.Padding
 26         bdr.Padding = _thicknessEmpty
 27     }
 28 }
 29 
ExcelCellStyle

樓主就照這個思路進行優化,每個單元格有一個默認的 Border——bdr,讓它負責處理 C1FlexGrid 默認的條條框框顯示,即在一中提及的灰色線條;然后再嵌套兩層 Border,一個負責右邊框,一個負責下邊框,理由是為了不讓重疊的邊框顯示成粗線條,令所有單元格都只負責處理其右邊框和下邊框,並將該單元格的上邊框交由它上面那個單元格的下邊框負責,該單元格的左邊框交由它左側那個單元格的右邊框負責,這樣達成一致后,就可以避免相鄰單元格中間出現粗線條的現象。

image

三  優化實現

在自定義的 CellStyle 中定義自己的單元格邊框設置,如下

private Thickness _bdrThickness;// 單元格邊框

然后在自動應用單元格樣式的方法 Apply 中實現優化:

  1 /// <summary>
  2 /// 重繪單元格時,嵌套兩層Border用來分別顯示右邊框和下邊框
  3 /// </summary>
  4 public override void Apply(Border bdr, SelectedState selState)
  5 {
  6     base.Apply(bdr, selState)
  7     
  8     // 下邊框
  9     Border bottom = new Border()
 10     bottom.BorderThickness = new Thickness(0, 0, 0, 1)
 11     bottom.BorderBrush = _bdrThickness.Bottom == 1
 12                         ? new SolidColorBrush(Colors.Black)
 13                         : new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7))
 14 
 15     // 右邊框
 16     Border right = new Border()
 17     right.BorderThickness = new Thickness(0, 0, 1, 0)
 18     right.BorderBrush = _bdrThickness.Right == 1
 19                         ? new SolidColorBrush(Colors.Black)
 20                         : new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7))
 21 
 22     // 左邊框和上邊框放在最外面的主邊框進行設置
 23     if (_bdrThickness.Left == 1 || _bdrThickness.Top == 1)
 24     {
 25         bdr.BorderBrush = new SolidColorBrush(Colors.Black)
 26         bdr.BorderThickness = new Thickness(_bdrThickness.Left, _bdrThickness.Top, 0, 0)
 27     }
 28     else
 29     {
 30         bdr.BorderThickness = new Thickness(0, 0, 0, 0)
 31     }
 32 
 33     UIElement content = bdr.Child
 34     bdr.Child = bottom
 35     bottom.Child = right
 36     right.Child = content
 37 
 38     right.Padding = bdr.Padding
 39     bottom.Padding = _thicknessEmpty
 40     bdr.Padding = _thicknessEmpty
 41 }
 42 

最后在 C1FlexGrid 的 CellFactory 中應用單元格樣式時,就取在 CellStyle 中自己定義的單元格邊框 _bdrThickness 值作為 Border 的邊框值即可。

當然了,對 C1FlexGrid 的單元格邊框優化完成之后,對於在設置單元格邊框時是有一條原則的,就是如果設置該單元格的右邊框和下邊框,那好辦,直接設置該單元格的 _bdrThickness 屬性即可;但是如果設置該單元的左邊框和上邊框,就要交給對應的單元格對應的邊框進行處理。

好了,最后看一下樓主將優化方案放進 仿Excel擴展C1FlexGrid控件 的效果吧。

image

這套優化方案是根據 Demo 里的啟發實現的。

請多指教,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM