#
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