91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF利用附加屬性修改ShowGridLines效果的方法

發布時間:2021-02-18 12:50:43 來源:億速云 閱讀:271 作者:小新 欄目:編程語言

這篇文章主要介紹了WPF利用附加屬性修改ShowGridLines效果的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

附加屬性是說一個屬性本來不屬于某個對象,但由于某種需求而被后來附加上,也就是把對象放入一個特定環境后對象才具有的屬性就稱為附加屬性,附加屬性的作用就是將屬性與數據類型解耦,讓數據類型的設計更加靈活,舉例,一個TextBox被放在不同的布局容器中時就會有不同的布局屬性,這些屬性就是由布局容器為TextBox附加上的,附加屬性的本質就是依賴屬性,二者僅僅在注冊和包裝器上有一點區別

小技巧,在VS中輸入propa后,連按兩次tab鍵,可以添加好一個附加屬性的框架,繼續按tab鍵,可以繼續修改附加屬性的內容

本文主要介紹的是關于WPF用附加屬性修改ShowGridLines效果的相關內容,下面話不多說了,來一起看看詳細的介紹吧。

1.思路主要代碼

wpf的gridline原本效果是虛線類型的。有時候需要設計成表格形式的,因此有了用附加屬性來自動繪制邊框線的想法。

思路:繪制Line并添加到grid的children里,但效果并不理想,會出現鋸齒,像素對齊,模糊等問題。

UseLayoutRounding="False"
SnapsToDevicePixels="True"

RenderOptions.EdgeModeProperty 貌似都沒起作用。

于是想到了用border來實現,簡單又實用吧 哈哈。

大致思路如下:

繪制border的左邊框和上邊框,在邊界的時候考慮邊界封閉。然后將border平移一半的距離。這樣邊框就居中并且包圍了所有的線。

WPF利用附加屬性修改ShowGridLines效果的方法

主要代碼如下:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace 用附加屬性修改Grid的邊框
{
 public class GridHelper
 {
  private static void RefreshGrid(Grid grid, int lineWidth, Brush color)
  {
   for (var i = grid.Children.Count - 1; i > 0; i--)
   {
    var child = grid.Children[i];
    var bd = child as Border;
    if (bd != null && bd.Tag != null && bd.Tag.ToString() == "gridline")
    {
     grid.Children.Remove(bd);
    }
   }
   var rows = grid.RowDefinitions.Count;
   var cols = grid.ColumnDefinitions.Count;
   //邊界考慮
   if (rows == 0)
   {
    rows = 1;
   }
   if (cols == 0)
   {
    cols = 1;
   }
   //生成行列
   for (var i = 0; i < rows; i++)
   {
    for (var j = 0; j < cols; j++)
    {
     var thick = new Thickness(lineWidth, lineWidth, 0, 0);
     var margin = new Thickness(-lineWidth/2d, -lineWidth/2d, 0, 0);
     //邊界考慮
     if (i == 0)
     {
      margin.Top = 0;
     }
     if (i == rows - 1)
     {
      thick.Bottom = lineWidth;
     }
     if (j == 0)
     {
      margin.Left = 0;
     }
     if (j == cols - 1)
     {
      thick.Right = lineWidth;
     }
     var bd = new Border
     {
      BorderThickness = thick,
      Margin = margin,
      BorderBrush = color,
      Tag = "gridline"
     };
     Grid.SetRow(bd, i);
     Grid.SetColumn(bd, j);
     grid.Children.Add(bd);
    }
   }
   grid.InvalidateArrange();
   grid.InvalidateVisual();
  }
 
  #region 線顏色
  // Using a DependencyProperty as the backing store for LineColor. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty LineColorProperty =
   DependencyProperty.RegisterAttached("LineColor", typeof (Brush), typeof (GridHelper),
    new PropertyMetadata(Brushes.Black, LineColorPropertyChanged));
 
  public static Brush GetLineColor(DependencyObject obj)
  {
   return (Brush) obj.GetValue(LineColorProperty);
  }
 
  public static void SetLineColor(DependencyObject obj, Brush value)
  {
   obj.SetValue(LineColorProperty, value);
  }
 
 
  private static void LineColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
   var grid = d as Grid;
   if (grid == null)
   {
    return;
   }
   var showLines = GetShowGridLines(grid);
   var color = GetLineColor(grid);
   var lineWidth = GetLineWidth(grid);
   if (showLines)
   {
    // grid.SnapsToDevicePixels = true;
    grid.Loaded += delegate { RefreshGrid(grid, lineWidth, color); };
   }
  }
 
  #endregion 
  #region 線寬度 
  // Using a DependencyProperty as the backing store for LineWidth. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty LineWidthProperty =
   DependencyProperty.RegisterAttached("LineWidth", typeof (int), typeof (GridHelper),
    new PropertyMetadata(1, LineWidthPropertyChanged)); 
  public static int GetLineWidth(DependencyObject obj)
  {
   return (int) obj.GetValue(LineWidthProperty)
    ;
  }
 
 
  public static void SetLineWidth(DependencyObject obj, int value)
  {
   obj.SetValue(LineWidthProperty, value);
  }
 
 
  private static void LineWidthPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
   var grid = d as Grid;
   if (grid == null)
   {
    return;
   }
   var showLines = GetShowGridLines(grid);
   var color = GetLineColor(grid);
   var lineWidth = GetLineWidth(grid);
   if (showLines)
   {
    // grid.SnapsToDevicePixels = true;
    grid.Loaded += delegate { RefreshGrid(grid, lineWidth, color); };
   }
  }
 
  #endregion
  #region 是否顯示線
  // Using a DependencyProperty as the backing store for ShowGridLines. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty ShowGridLinesProperty =
   DependencyProperty.RegisterAttached("ShowGridLines", typeof (bool), typeof (GridHelper),
    new PropertyMetadata(false, ShowGridLinesPropertyChanged));
 
  public static bool GetShowGridLines(DependencyObject obj)
  {
   return (bool) obj.GetValue(ShowGridLinesProperty);
  }
 
  public static void SetShowGridLines(DependencyObject obj, bool value)
  {
   obj.SetValue(ShowGridLinesProperty, value);
  }
 
 
  private static void ShowGridLinesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
   var grid = d as Grid;
   if (grid == null)
   {
    return;
   }
   var showLines = GetShowGridLines(grid);
   var color = GetLineColor(grid);
   var lineWidth = GetLineWidth(grid);
   if (showLines)
   {
    // grid.SnapsToDevicePixels = true;
    grid.Loaded += delegate { RefreshGrid(grid, lineWidth, color); };
   }
  }
  #endregion
 }
}

2.效果圖

效果還可以,任何分辨率下,任何邊框大小,都沒有出現像素對齊或者模糊問題。 圖中的虛線是grid的默認gridLine,紅色和綠色是自定義的gridline,跟虛線完美重合。

WPF利用附加屬性修改ShowGridLines效果的方法 感謝你能夠認真閱讀完這篇文章,希望小編分享的“WPF利用附加屬性修改ShowGridLines效果的方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乡县| 碌曲县| 弥渡县| 大连市| 天长市| 任丘市| 西乌珠穆沁旗| 杭锦旗| 泽普县| 雅安市| 绥芬河市| 武宁县| 策勒县| 岑溪市| 绿春县| 敖汉旗| 右玉县| 融水| 内丘县| 青海省| 新兴县| 临高县| 天气| 囊谦县| 北碚区| 金湖县| 呼玛县| 和田县| 应城市| 耿马| 平原县| 沁水县| 永德县| 淮阳县| 铁岭县| 德阳市| 苍南县| 海口市| 务川| 卢龙县| 汶上县|