亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WPF如何利用附加屬性修改ShowGridLines效果詳解

2019-10-29 21:05:59
字體:
來源:轉載
供稿:網友

前言

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

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

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

1.思路主要代碼

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

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

UseLayoutRounding="False"
SnapsToDevicePixels="True"

RenderOptions.EdgeModeProperty 貌似都沒起作用。

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

大致思路如下:

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

wpf,附加屬性,showdialog,附加屬性詳解

主要代碼如下:

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,附加屬性,showdialog,附加屬性詳解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产91久久久久久老师| 国产一区二区香蕉| 91精品在线一区| 国产黑人绿帽在线第一区| 成人欧美在线观看| 欧美另类99xxxxx| 欧美精品aaa| 亚洲人成人99网站| 中文字幕亚洲欧美在线| 中文字幕欧美日韩在线| 国产精品极品在线| 国产精品网站大全| 亚洲第五色综合网| 久久夜色精品国产欧美乱| 精品国产拍在线观看| 国内精品免费午夜毛片| 欧美激情一级二级| 亚洲品质视频自拍网| 91久久久久久久久久久久久| 日韩亚洲第一页| 欧美国产日韩xxxxx| 青青草原成人在线视频| 国产日本欧美一区二区三区| 久久久这里只有精品视频| 色综合亚洲精品激情狠狠| 国产精品丝袜久久久久久高清| 色偷偷噜噜噜亚洲男人的天堂| 欧美猛少妇色xxxxx| 亚洲一区二区三区在线免费观看| 久久人人爽人人| 欧美日韩第一页| 在线免费看av不卡| 亚洲影院高清在线| 97视频网站入口| 欧美网站在线观看| 国产人妖伪娘一区91| 国产91久久婷婷一区二区| 国产福利精品视频| 久久视频在线视频| 91色中文字幕| 国产综合视频在线观看| 久久久久久高潮国产精品视| 亚洲乱码一区av黑人高潮| 国内外成人免费激情在线视频| 久久免费成人精品视频| 国产丝袜一区二区三区| 国产美女搞久久| 久久影院资源站| 成人久久精品视频| 尤物yw午夜国产精品视频明星| 亚洲天堂成人在线视频| 97视频在线免费观看| 91成人福利在线| 91天堂在线视频| 亚洲а∨天堂久久精品喷水| 亚洲精品美女久久| 91视频九色网站| 日韩一中文字幕| 亚洲欧美国产精品va在线观看| 影音先锋日韩有码| 成人黄色av免费在线观看| 国产中文字幕91| 成人欧美一区二区三区在线| 亚洲性夜色噜噜噜7777| 欧洲亚洲妇女av| 国产精品成人在线| 国产极品jizzhd欧美| 久久亚洲国产精品成人av秋霞| 91在线视频精品| 日本久久久久久久久久久| 91经典在线视频| 日韩免费电影在线观看| 欧美亚洲视频一区二区| 欧美国产日韩一区二区| 久久精品久久精品亚洲人| 日韩欧中文字幕| 日韩成人av网| 欧美久久精品午夜青青大伊人| 在线a欧美视频| 久久久久久亚洲精品不卡| 亚洲欧洲高清在线| 97视频在线播放| 亚洲精品一区二区在线| 欧美日韩xxxxx| 日韩精品有码在线观看| 欧美午夜丰满在线18影院| 欧美日韩亚洲成人| 久久久视频在线| 中文字幕日韩在线播放| 国产精品久久久91| 亚洲午夜未删减在线观看| 久久精品2019中文字幕| 国产综合香蕉五月婷在线| 国产999在线观看| 精品久久久久久| 中文字幕av一区中文字幕天堂| 国产成人亚洲综合| 18久久久久久| 久久久久久亚洲精品| 欧美激情一区二区三区在线视频观看| 成人观看高清在线观看免费| www.亚洲男人天堂| 奇门遁甲1982国语版免费观看高清| 日韩电影在线观看中文字幕| 欧美日韩亚洲一区二| 国产69精品久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 91视频-88av| 日韩中文字幕在线免费观看| 日韩国产精品亚洲а∨天堂免| 欧美日本啪啪无遮挡网站| 成人日韩av在线| 国产97在线视频| 久久精品亚洲94久久精品| 欧美激情一区二区三区高清视频| 国产精品一区二区久久精品| 亚洲女人天堂网| 琪琪第一精品导航| 亚洲综合第一页| 97视频在线看| 97在线观看视频国产| 国产午夜精品视频| 日韩在线中文字| 爱福利视频一区| 亚洲性69xxxbbb| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲性线免费观看视频成熟| 清纯唯美日韩制服另类| 国产性色av一区二区| 精品国产一区二区三区久久狼5月| 国产一区二区三区丝袜| 欧美老女人在线视频| 在线日韩av观看| 国产精品视频不卡| 亚洲精品一区二区三区不| 久久精品人人做人人爽| 疯狂做受xxxx高潮欧美日本| 欧美在线观看视频| 日韩欧美高清视频| 国产精品美女主播在线观看纯欲| 日本亚洲欧美成人| 久久天天躁夜夜躁狠狠躁2022| 92国产精品视频| 永久555www成人免费| 黑人极品videos精品欧美裸| 日韩中文视频免费在线观看| 国产精品国产三级国产aⅴ浪潮| 国产日产久久高清欧美一区| 久久成人免费视频| 久久精品久久久久电影| 尤物99国产成人精品视频| 国产精品视频xxxx| 国产91|九色| 国产精品白丝av嫩草影院| 欧美老少做受xxxx高潮| 欧美老女人www| 欧美日韩在线第一页| 色999日韩欧美国产| 国产精品久久中文| 国产午夜精品全部视频在线播放| 欧亚精品中文字幕| 国产精品久久久| 日韩一区在线视频| 日本久久久久亚洲中字幕|