最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年04月13日 11:32:33   作者:冷火蟲  
這篇文章主要給大家介紹了關(guān)于WPF如何利用附加屬性修改ShowGridLines效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

前言

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

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

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

1.思路主要代碼

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

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

UseLayoutRounding="False"
SnapsToDevicePixels="True"

RenderOptions.EdgeModeProperty 貌似都沒起作用。

于是想到了用border來實(shí)現(xiàn),簡單又實(shí)用吧 哈哈。

大致思路如下:

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

主要代碼如下:

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.效果圖

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

 

3.源碼下載

下載地址:http://xiazai.jb51.net/201804/yuanma/WPF-fujia-ShowGridLines(jb51.net).rar

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C#實(shí)現(xiàn)Dictionary字典賦值的方法

    C#實(shí)現(xiàn)Dictionary字典賦值的方法

    本文主要介紹了C#實(shí)現(xiàn)Dictionary字典賦值的方法,如同java中的Hasttable,C#里面有Dictionary,可以實(shí)現(xiàn)很高效的鍵值對(duì)操作。感興趣的可以了解一下
    2021-05-05
  • C# OpenFileDialog對(duì)話框控件的使用

    C# OpenFileDialog對(duì)話框控件的使用

    OpenFileDialog是C#中常用的對(duì)話框控件,用于讓用戶選擇文件,本文就來介紹一下OpenFileDialog對(duì)話框控件的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C#實(shí)現(xiàn)的調(diào)用DOS命令操作類實(shí)例

    C#實(shí)現(xiàn)的調(diào)用DOS命令操作類實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)的調(diào)用DOS命令操作類,實(shí)例分析了C#調(diào)用系統(tǒng)常用DOS命令的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#讀取二進(jìn)制文件方法分析

    C#讀取二進(jìn)制文件方法分析

    這篇文章主要介紹了C#讀取二進(jìn)制文件方法,較為詳細(xì)的分析了C#讀取二進(jìn)制文件的原理與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 深入理解C#中回調(diào)函數(shù)

    深入理解C#中回調(diào)函數(shù)

    回調(diào)函數(shù)是一種在編程中常用的概念,本文將介紹回調(diào)函數(shù)的概念、語法和應(yīng)用,并討論如何設(shè)計(jì)優(yōu)化和重用回調(diào)函數(shù),以及它們?cè)诓l(fā)編程中的用途,感興趣的可以了解一下
    2024-02-02
  • C# 調(diào)用API函數(shù)彈出映射網(wǎng)絡(luò)驅(qū)動(dòng)器對(duì)話框問題

    C# 調(diào)用API函數(shù)彈出映射網(wǎng)絡(luò)驅(qū)動(dòng)器對(duì)話框問題

    C#中的.net的常用對(duì)話框中沒有映射網(wǎng)絡(luò)驅(qū)動(dòng)映射對(duì)話框,所以需要用windows的API函數(shù)去實(shí)現(xiàn)彈出映射網(wǎng)絡(luò)驅(qū)動(dòng)器對(duì)話框
    2014-01-01
  • C#實(shí)現(xiàn)人臉識(shí)別超簡單方法舉例

    C#實(shí)現(xiàn)人臉識(shí)別超簡單方法舉例

    這篇文章主要給大家介紹了關(guān)于C#實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,文中講解了在C#中使用EmguCV庫進(jìn)行人臉識(shí)別的簡單示例,包括安裝EmguCV庫、準(zhǔn)備訓(xùn)練數(shù)據(jù)、編寫代碼和運(yùn)行程序,需要的朋友可以參考下
    2024-11-11
  • ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法

    ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法

    本文主要介紹了7種獲取當(dāng)前路徑的方法,并做了代碼演示,分享給大家,感興趣的朋友可以參考一下。
    2016-03-03
  • C#實(shí)現(xiàn)兩接口中同名方法實(shí)例分析

    C#實(shí)現(xiàn)兩接口中同名方法實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)兩接口中同名方法,涉及C#接口與方法的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • C#中async/await之線程上下文工作原理

    C#中async/await之線程上下文工作原理

    這篇文章主要為大家介紹了C#中async/await之線程上下文工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-05-05

最新評(píng)論

阳江市| 元氏县| 上林县| 嵊州市| 塔河县| 乌苏市| 青神县| 宁安市| 宝鸡市| 枣庄市| 调兵山市| 靖宇县| 庄浪县| 临朐县| 开远市| 崇阳县| 泉州市| 当雄县| 建昌县| 韶关市| 抚顺市| 丹江口市| 黄梅县| 金溪县| 扎囊县| 宁晋县| 莱西市| 荔浦县| 吴旗县| 扎兰屯市| 富顺县| 会理县| 山西省| 靖安县| 广东省| 苏尼特左旗| 淮阳县| 布尔津县| 五家渠市| 靖边县| 龙里县|