WPF应⽤-⾃动表格创建
根据⾏数,列数⾃动创建表格,使⽤WPF中的Grid很容易实现,并且容易实现单元格的合并拆分。主要需要解决两个问题:
1. 单元格的定位,那⼀⾏,那⼀列,占⼏⾏,占⼏列
2. 单元格的边框
⾏,列,占⾏,占列
该问题⽐较容易解决,Grid分⾏,分列后,添加的控件可以使⽤Grid.Row,Grid.Column,Grid.RowSpan,Grid.ColumnSpan解决。单元格边框
每⼀个单元格使⽤⼀个Border,控制上下左右的边框达到显⽰单元格边框,具体如下图:
需要注意的是,最终表格的每个单元格中是包含其它控件的,如textbox,该控件的最⼩⾼度若是22,则对于⾸⾏来说,其⾼度应该是22+2=24,对于其它⾏来说,⾼度应该是22+1=23,即需要包含边框,同理,列宽有时也需要注意,实践中发现列宽基本不影响,所以可不调节。
最后实现的图⽰:
相关代码:
后台代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
var rowct = int.Parse(tbRow.Text);
var colct = int.Parse(tbCol.Text);
InitRowDefAndColDef(gd, rowct, colct);
InitGridCell(gd);
}
htmlborder
private void InitRowDefAndColDef(Grid grid, int rowct, int colct)
{
for (int i = 0; i < rowct; i++)
{
var rowdef = new RowDefinition {MinHeight = 22 + (i == 0 ? 2 : 1)};
grid.RowDefinitions.Add(rowdef);
}
for (int i = 0; i < colct; i++)
{
grid.ColumnDefinitions.Add(new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)});
}
}
private void InitGridCell(Grid grid)
{
var rowct = grid.RowDefinitions.Count;
var colct = grid.ColumnDefinitions.Count;
for(int i=0;i<rowct;i++)
for (int j = 0; j < colct; j++)
{
var border = new Border();
//border.Margin = new Thickness(3);
border.SetValue(Grid.RowProperty,i);
border.SetValue(Grid.ColumnProperty, j);
border.Style = this.FindResource("cellStyle") as Style;
grid.Children.Add(border);
}
}
}
前台代码:
<Window x:Class="testxx.MainWindow"
xmlns="schemas.microsoft/winfx/2006/xaml/presentation"
xmlns:x="schemas.microsoft/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="cellStyle" TargetType="Border">
<Setter Property="BorderBrush"Value="Black"></Setter>
<Setter Property="BorderThickness"Value="0,0,1,1"></Setter>
<Style.Triggers>
<Trigger Property="Grid.Row"Value="0">
<Setter Property="BorderThickness"Value="0,1,1,1"></Setter>
</Trigger>
<Trigger Property="Grid.Column"Value="0">
<Setter Property="BorderThickness"Value="1,0,1,1"></Setter>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Grid.Row"Value="0"></Condition>
<Condition Property="Grid.Column"Value="0"></Condition>
</MultiTrigger.Conditions>
<Setter Property="BorderThickness"Value="1,1,1,1"></Setter>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="411*"/>
<ColumnDefinition Width="106*"/>
</Grid.ColumnDefinitions>
<Grid Margin="10" Name="gd"Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<Button x:Name="btnAdd" Content="Add" HorizontalAlignment="Left" Margin="20.884,133,0,0" VerticalAlignment="Top" Width="75" Click="btnAdd_Clic        <TextBox x:Name="tbRow" HorizontalAlignment="Left" Height="23" Margin="20.884,41,0,0" TextWrapping="Wrap"Text="4" VerticalAlignment=
<TextBox x:Name="tbCol" HorizontalAlignment="Left" Height="23" Margin="20.884,83,0,0" TextWrapping="Wrap"Text="5" VerticalAlignment=
</Grid>
</Window>
问题
画出来的线有时线宽不是1,稍微调整表格⾼度或宽度⼜会正常,如下图正常显⽰的,可以明显对⽐出来,实际边框宽度均为1。
貌似和什么浮点绘图有关系,解决其实简单,设置外层控件的SnapsToDevicePixels = True即可(不要使⽤OverrideMetadata,实验结果发
现这样结果不对,可以放在style中或构造函数中)。
其它
这⾥给出了表格的⾃动⽣成⽅式,对于表格的拆分,合并,拖动选中(需要计算选中的单元格集,必须是⼀个长⽅块),需要通过设置
Border的RowSpan及ColSpan解决。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。