相关文章推荐
奔跑的茄子  ·  C# ...·  2 周前    · 
千杯不醉的绿茶  ·  WPF combobox ...·  1 周前    · 
爱看球的牙膏  ·  IDEA ...·  8 月前    · 
仗义的冲锋衣  ·  gradle ...·  1 年前    · 
温柔的拐杖  ·  包含JSONObject和JSONArray ...·  1 年前    · 
//暂时不处理实时显示的事情 # region 显示边框信息 public static readonly DependencyProperty ShowBorderProperty = DependencyProperty . RegisterAttached ( "ShowBorder" , typeof ( bool ) , typeof ( GridOptions ) , new PropertyMetadata ( OnShowBorderChanged ) ) ; public static bool GetShowBorder ( DependencyObject obj ) return ( bool ) obj . GetValue ( ShowBorderProperty ) ; public static void SetShowBorder ( DependencyObject obj , bool value ) obj . SetValue ( ShowBorderProperty , value ) ; public static void OnShowBorderChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e ) var grid = d as Grid ; if ( ( bool ) e . OldValue ) grid . Loaded -= ( s , arg ) => { } ; grid . Loaded += new RoutedEventHandler ( GridLoaded ) ; # endregion # region 线宽信息 public static readonly DependencyProperty LineThicknessProperty = DependencyProperty . RegisterAttached ( "LineThickness" , typeof ( double ) , typeof ( GridOptions ) , new PropertyMetadata ( 1d , OnGridLineThicknessChanged ) ) ; public static double GetLineThickness ( DependencyObject obj ) return ( double ) obj . GetValue ( LineThicknessProperty ) ; public static void SetLineThickness ( DependencyObject obj , double value ) obj . SetValue ( LineThicknessProperty , value ) ; public static void OnGridLineThicknessChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e ) # endregion public static readonly DependencyProperty LineBrushProperty = DependencyProperty . RegisterAttached ( "LineBrush" , typeof ( Brush ) , typeof ( GridOptions ) , new PropertyMetadata ( Brushes . Gray , OnGridLineBrushChanged ) ) ; # region 线画刷问题 public static Brush GetLineBrush ( DependencyObject obj ) var brush = ( Brush ) obj . GetValue ( LineBrushProperty ) ; return brush ?? Brushes . LightGray ; public static void SetLineBrush ( DependencyObject obj , Brush value ) obj . SetValue ( LineBrushProperty , value ) ; public static void OnGridLineBrushChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e ) # endregion private static void GridLoaded ( object sender , RoutedEventArgs e ) # region 思路 * 1、覆盖所有单元格都要包围上边框。 * 2、边框线不能存在重复。每个单元格绘制【右下】部分,主体绘制右上部分 # endregion var grid = sender as Grid ; var rowCount = Math . Max ( 1 , grid . RowDefinitions . Count ) ; var columnCount = Math . Max ( 1 , grid . ColumnDefinitions . Count ) ; # region 初始化标准数组 int [ , ] flagArray = new int [ rowCount , columnCount ] ; # endregion var controls = grid . Children ; var count = controls . Count ; var settingThickness = GetLineThickness ( grid ) ; var borderBrush = GetLineBrush ( grid ) ; for ( int i = 0 ; i < count ; i ++ ) var item = controls [ i ] as FrameworkElement ; var row = Grid . GetRow ( ( item ) ) ; var column = Grid . GetColumn ( item ) ; var rowSpan = Grid . GetRowSpan ( item ) ; var columnSpan = Grid . GetColumnSpan ( item ) ; for ( int rowTemp = 0 ; rowTemp < rowSpan ; rowTemp ++ ) for ( int colTemp = 0 ; colTemp < columnSpan ; colTemp ++ ) flagArray [ rowTemp + row , colTemp + column ] = 1 ; var border = CreateBorder ( row , column , rowSpan , columnSpan , settingThickness ) ; border . BorderBrush = borderBrush ; grid . Children . RemoveAt ( i ) ; border . Child = item ; grid . Children . Insert ( i , border ) ; # region 整理为填充单元格 for ( int i = 0 ; i < rowCount ; i ++ ) for ( int k = 0 ; k < columnCount ; k ++ ) if ( flagArray [ i , k ] == 0 ) var border = CreateBorder ( i , k , 1 , 1 , settingThickness ) ; border . BorderBrush = borderBrush ; grid . Children . Add ( border ) ; # endregion private static Border CreateBorder ( int row , int column , int rowSpan , int columnSpan , double thickness ) var useThickness = new Thickness ( 0 , 0 , thickness , thickness ) ; if ( row == 0 ) useThickness . Top = thickness ; if ( column == 0 ) useThickness . Left = thickness ; var border = new Border ( ) BorderThickness = useThickness , Grid . SetRow ( border , row ) ; Grid . SetColumn ( border , column ) ; Grid . SetRowSpan ( border , rowSpan ) ; Grid . SetColumnSpan ( border , columnSpan ) ; return border ;

二、xaml代码:

<Grid  x:Name="mesureGrid" Margin="50" ScrollViewer.CanContentScroll="True" local:GridOptions.ShowBorder="True" Grid.Column="1" Grid.Row="1"
                      Background="White" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Text="1234" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
                    WPF 显示Grid网格线一、添加GridOptions类:public class GridOptions    {        //暂时不处理实时显示的事情        #region 显示边框信息        public static readonly DependencyProperty ShowBorderProperty =            DependencyProperty.RegisterAttached("ShowBorder", typeof(bool), 
				
一、基础知识 1、DataGrid控件:用来显示数据的控件,从对象集合中获取信息并在具有行和单元格的网格显示信息。每行和单独的对象相对应,并且每列和对象的某个属性相对应。 2、在DataGrid 中同时包含“自动生成列”与“用户自定义列” 由属性AutoGenerateColumns控制。 <DataGrid Name="dataGrid1" AutoGenerateColumns...
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Heigh
相信大家在做WPF项目的时候,都会用到Grid这个布局控件,一般情况下,如果只是为了布局,那就不需要显示它的边框,但是也有特殊需求,如果把它当做表格来使用,那就需要为它添加实线边框。下面帖代码: using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace WPFSt...
最近在使用伟景行的三维平台开发三维管廊监控运维平台,开发语言是C#,使用的是WPF框架,需要对DataGrid进行自定义开发。包括列头、边线、背景色、前景色等。效果如图:  DataGrid整体实现代码如下:  <DataGrid Name="dataGridAlarm" AutoGenerateColumns="False" CanUserAddRows="False" CanUse
前面介绍过使用DataGrid简单绑定一个数据模型,接着介绍DataGrid的一些详细操作。 参考:C# WPF DataGrid的使用 定制DataGrid控件基本外观属性 RowBackground、AlternatingRowBackground:用于绘制每行背景的画刷(RowBackground),并且决定是否使用不同的背景颜色绘制交替行。在默认情况下,DataGrid控件为奇数行提供白色...
2. 定义行和列 在Grid控件中,可以通过定义行和列来确定UI元素的位置。要定义行和列,请使用Grid.RowDefinitions和Grid.ColumnDefinitions属性。以下是一个例子: <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <!-- UI元素将被添加到此处 --> </Grid> 在这个例子中,我们定义了两个行,第一个行的高度是Auto,第二个行的高度是*,这意味着它会占据Grid控件中剩余的空间。我们还定义了两列,第一列的宽度是*,第二列的宽度是Auto,这意味着第一列将占据Grid控件的大部分空间,第二列将占据其余空间。 3. 添加UI元素 要向Grid控件添加UI元素,请将它们放在Grid中,并为它们指定Grid.Row和Grid.Column属性。例如,以下代码向刚刚定义的Grid控件中添加了两个Button: <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Button Grid.Row="0" Grid.Column="0" Content="Button 1" /> <Button Grid.Row="0" Grid.Column="1" Content="Button 2" /> </Grid> 在这个例子中,第一个Button位于第一个行的第一个列,第二个Button位于第一个行的第二列。 4. 合并行和列 在Grid控件中,可以合并相邻的行或列,以创建更复杂的布局。要合并行或列,请将多个UI元素的Grid.RowSpan或Grid.ColumnSpan属性设置为相同的值。例如,以下代码创建了一个跨越两行的TextBox: <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" /> <Button Grid.Row="1" Grid.Column