如何:使用 ColumnDefinitionsCollection 和 RowDefinitionsCollection 来操作列和行
此示例演示如何使用 ColumnDefinitionCollection 和 RowDefinitionCollection 类中的方法对行或列的内容执行添加、清除或计数等操作。 例如,可以 Add、Clear 或 Count 包含在 ColumnDefinition 或 RowDefinition 中的项。
示例
以下示例使用 grid1
的 Name 创建 Grid 元素。 Grid 包含 StackPanel,后者保存了 Button 元素,其中每个元素由不同的集合方法控制。 单击 Button 时,它会激活代码隐藏文件中的方法调用。
<DockPanel Margin="10,0,0,0">
<TextBlock FontSize="20" FontWeight="Bold" DockPanel.Dock="Top">Grid Column and Row Collections</TextBlock>
<TextBlock DockPanel.Dock="Top">Click any of the buttons below to invoke the associated methods and properties of ColumnDefinition and RowDefinition Collections.</TextBlock>
<Grid DockPanel.Dock="Top" HorizontalAlignment="Left" Name="grid1" ShowGridLines="true" Width="625" Height="400" Background="#b0e0e6">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
</Grid>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Width="625" DockPanel.Dock="Top">
<Button Width="125" Click="addCol">Add Column</Button>
<Button Width="125" Click="addRow">Add Row</Button>
<Button Width="125" Click="clearCol">Clear All Columns</Button>
<Button Width="125" Click="clearRow">Clear All Rows</Button>
<Button Width="125" Click="removeCol">Remove One Column</Button>
</StackPanel>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Width="625" DockPanel.Dock="Top">
<Button Width="125" Click="removeRow">Remove One Row</Button>
<Button Width="125" Click="colCount">How Many Columns?</Button>
<Button Width="125" Click="rowCount">How Many Rows?</Button>
<Button Width="125" Click="rem5Col">Remove 5 Columns</Button>
<Button Width="125" Click="rem5Row">Remove 5 Rows</Button>
</StackPanel>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Width="625" DockPanel.Dock="Top">
<Button Width="125" Click="containsRow">Contains Row?</Button>
<Button Width="125" Click="containsCol">Contains Column?</Button>
<Button Width="125" Click="insertRowAt">Insert Row</Button>
<Button Width="125" Click="insertColAt">Insert Column</Button>
<Button Width="125" Click="colReadOnly">IsReadOnly?</Button>
</StackPanel>
<TextBlock DockPanel.Dock="Top" Name="tp1"/>
<TextBlock DockPanel.Dock="Top" Name="tp2"/>
<TextBlock DockPanel.Dock="Top" Name="tp3"/>
<TextBlock DockPanel.Dock="Top" Name="tp4"/>
<TextBlock DockPanel.Dock="Top" Name="tp5"/>
</DockPanel>
此示例定义一系列自定义方法,每个方法对应于 Extensible Application Markup Language (XAML) 文件中的 Click 事件。 可以通过多种方法更改 Grid 中的列数和行数,这些方法包括添加或删除行和列,以及计算行和列的总数。 若要防止 ArgumentOutOfRangeException 和 ArgumentException 异常,可以使用 RemoveRange 方法提供的错误检查功能。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace columndefinitions_grid
{
public partial class Window1 : Window
{
RowDefinition rowDef1;
ColumnDefinition colDef1;
private void addCol(object sender, RoutedEventArgs e)
{
colDef1 = new ColumnDefinition();
grid1.ColumnDefinitions.Add(colDef1);
}
private void addRow(object sender, RoutedEventArgs e)
{
rowDef1 = new RowDefinition();
grid1.RowDefinitions.Add(rowDef1);
}
private void clearCol(object sender, RoutedEventArgs e)
{
grid1.ColumnDefinitions.Clear();
}
private void clearRow(object sender, RoutedEventArgs e)
{
grid1.RowDefinitions.Clear();
}
private void removeCol(object sender, RoutedEventArgs e)
{
if (grid1.ColumnDefinitions.Count <= 0)
{
tp1.Text = "No More Columns to Remove!";
}
else
{
grid1.ColumnDefinitions.RemoveAt(0);
}
}
private void removeRow(object sender, RoutedEventArgs e)
{
if (grid1.RowDefinitions.Count <= 0)
{
tp1.Text = "No More Rows to Remove!";
}
else
{
grid1.RowDefinitions.RemoveAt(0);
}
}
private void colCount(object sender, RoutedEventArgs e)
{
tp2.Text = "The current number of Columns is: " + grid1.ColumnDefinitions.Count;
}
private void rowCount(object sender, RoutedEventArgs e)
{
tp2.Text = "The current number of Rows is: " + grid1.RowDefinitions.Count;
}
private void rem5Col(object sender, RoutedEventArgs e)
{
if (grid1.ColumnDefinitions.Count < 5)
{
tp1.Text = "There aren't five Columns to Remove!";
}
else
{
grid1.ColumnDefinitions.RemoveRange(0,5);
}
}
private void rem5Row(object sender, RoutedEventArgs e)
{
if (grid1.RowDefinitions.Count < 5)
{
tp1.Text = "There aren't five Rows to Remove!";
}
else
{
grid1.RowDefinitions.RemoveRange(0, 5);
}
}
private void containsRow(object sender, RoutedEventArgs e)
{
if (grid1.RowDefinitions.Contains(rowDef1))
{
tp2.Text = "Grid Contains RowDefinition rowDef1";
}
else
{
tp2.Text = "Grid Does Not Contain RowDefinition rowDef1";
}
}
private void containsCol(object sender, RoutedEventArgs e)
{
if (grid1.ColumnDefinitions.Contains(colDef1))
{
tp3.Text = "Grid Contains ColumnDefinition colDef1";
}
else
{
tp3.Text = "Grid Does Not Contain ColumnDefinition colDef1";
}
}
private void colReadOnly(object sender, RoutedEventArgs e)
{
tp4.Text = "RowDefinitionsCollection IsReadOnly?: " + grid1.RowDefinitions.IsReadOnly.ToString();
tp5.Text = "ColumnDefinitionsCollection IsReadOnly?: " + grid1.ColumnDefinitions.IsReadOnly.ToString();
}
private void insertRowAt(object sender, RoutedEventArgs e)
{
rowDef1 = new RowDefinition();
grid1.RowDefinitions.Insert(grid1.RowDefinitions.Count, rowDef1);
tp1.Text = "RowDefinition added at index position " + grid1.RowDefinitions.IndexOf(rowDef1).ToString();
}
private void insertColAt(object sender, RoutedEventArgs e)
{
colDef1 = new ColumnDefinition();
grid1.ColumnDefinitions.Insert(grid1.ColumnDefinitions.Count, colDef1);
tp2.Text = "ColumnDefinition added at index position " + grid1.ColumnDefinitions.IndexOf(colDef1).ToString();
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
'@ <summary>
'@ Interaction logic for Window1.xaml
'@ </summary>
Partial Public Class Window1
Inherits Window
Dim rowDef1 As New RowDefinition
Dim colDef1 As New ColumnDefinition
Private Sub addCol(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim colDef1 As New ColumnDefinition
grid1.ColumnDefinitions.Add(colDef1)
End Sub
Private Sub addRow(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim rowDef1 As New RowDefinition()
grid1.RowDefinitions.Add(rowDef1)
End Sub
Private Sub clearCol(ByVal sender As Object, ByVal e As RoutedEventArgs)
grid1.ColumnDefinitions.Clear()
End Sub
Private Sub clearRow(ByVal sender As Object, ByVal e As RoutedEventArgs)
grid1.RowDefinitions.Clear()
End Sub
Private Sub removeCol(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.ColumnDefinitions.Count <= 0) Then
tp1.Text = "No More Columns to Remove!"
Else
grid1.ColumnDefinitions.RemoveAt(0)
End If
End Sub
Private Sub removeRow(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.RowDefinitions.Count <= 0) Then
tp1.Text = "No More Rows to Remove!"
Else
grid1.RowDefinitions.RemoveAt(0)
End If
End Sub
Private Sub colCount(ByVal sender As Object, ByVal e As RoutedEventArgs)
tp2.Text = "The current number of Columns is: " + grid1.ColumnDefinitions.Count.ToString()
End Sub
Private Sub rowCount(ByVal sender As Object, ByVal e As RoutedEventArgs)
tp2.Text = "The current number of Rows is: " + grid1.RowDefinitions.Count.ToString()
End Sub
Private Sub rem5Col(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.ColumnDefinitions.Count < 5) Then
tp1.Text = "There aren't five Columns to Remove!"
Else
grid1.ColumnDefinitions.RemoveRange(0, 5)
End If
End Sub
Private Sub rem5Row(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.RowDefinitions.Count < 5) Then
tp1.Text = "There aren't five Rows to Remove!"
Else
grid1.RowDefinitions.RemoveRange(0, 5)
End If
End Sub
Private Sub containsRow(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.RowDefinitions.Contains(rowDef1)) Then
tp2.Text = "Grid Contains RowDefinition rowDef1"
Else
tp2.Text = "Grid Does Not Contain RowDefinition rowDef1"
End If
End Sub
Private Sub containsCol(ByVal sender As Object, ByVal e As RoutedEventArgs)
If (grid1.ColumnDefinitions.Contains(colDef1)) Then
tp3.Text = "Grid Contains ColumnDefinition colDef1"
Else
tp3.Text = "Grid Does Not Contain ColumnDefinition colDef1"
End If
End Sub
Private Sub colReadOnly(ByVal sender As Object, ByVal e As RoutedEventArgs)
tp4.Text = "RowDefinitionsCollection IsReadOnly?: " + grid1.RowDefinitions.IsReadOnly.ToString()
tp5.Text = "ColumnDefinitionsCollection IsReadOnly?: " + grid1.ColumnDefinitions.IsReadOnly.ToString()
End Sub
Private Sub insertRowAt(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim rowDef1 As New RowDefinition
grid1.RowDefinitions.Insert(grid1.RowDefinitions.Count, rowDef1)
tp1.Text = "RowDefinition added at index position " + grid1.RowDefinitions.IndexOf(rowDef1).ToString()
End Sub
Private Sub insertColAt(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim colDef1 As New ColumnDefinition()
grid1.ColumnDefinitions.Insert(grid1.ColumnDefinitions.Count, colDef1)
tp2.Text = "ColumnDefinition added at index position " + grid1.ColumnDefinitions.IndexOf(colDef1).ToString()
End Sub
End Class
End Namespace