无法在WPF中动态创建列/行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在WPF中动态创建列/行相关的知识,希望对你有一定的参考价值。
我希望能够在WPF中动态设置窗口的大小,然后根据需要在网格中创建尽可能多的列和行。
我已经为它创建了一个方法,但似乎没有用。我还在XAML中添加了一个边框,看看是否有列和行,但我只看到一个正方形。而且,它不会抛出任何错误。
这是我的方法:
public void CreateField(Grid MainGrid, TextBox Columns, TextBox Rows, TextBox WHeight, TextBox WWidth, MainWindow MainWindow)
{
int ColumnCount = Int32.Parse(Columns.Text);
int RowCount = Int32.Parse(Rows.Text);
int WindowHeight = Int32.Parse(WHeight.Text);
int WindowWidth = Int32.Parse(WWidth.Text);
MainWindow.MainWindow1.Height = WindowHeight;
MainWindow.MainWindow1.Width = WindowWidth;
for(int a = 0; a <= ColumnCount; a++){
ColumnDefinition c = new ColumnDefinition();
c.Width = new GridLength(WindowWidth / ColumnCount, GridUnitType.Pixel);
MainGrid.ColumnDefinitions.Add(c);
}
for (int a = 0; a <= RowCount; a++)
{
RowDefinition r = new RowDefinition();
r.Height = new GridLength(WindowHeight / RowCount, GridUnitType.Pixel);
MainGrid.RowDefinitions.Add(r);
}
}
在XAML中,我只有1列和1行以及文本框和按钮的dockpanel。
<Border BorderBrush="Black" BorderThickness="2">
<Grid Name="MainWindowGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Name="DockPanel"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<DockPanel Background="LightSalmon" Grid.Row="0" Grid.Column="0" Grid.RowSpan="8">
<StackPanel>
<TextBox Name="txtColums" Text="16"/>
<TextBox Name="txtRows" Text="8"/>
<TextBox Name="txtWindowHeight" Text="800"/>
<TextBox Name="txtWindowWidth" Text="1600"/>
<Button x:Name="ButtonCreate" Content="Create" Click="ButtonCreate_Click"/>
</StackPanel>
</DockPanel>
<ContentControl Content="{Binding}"/>
</Grid>
</Border>
并且根据这里写的参数,该方法应该在按钮点击时执行。但是,我只有1列1行,而不是16列和8行的网格。 (你可以在边缘看到边框)
那么我在这里做错了什么?我对网格没有任何真正的经验,而且我很无能为力。希望有人可以帮助我。
编辑:
如ASh所说,激活MainGrid.ShowGridLines的建议奏效了。不知道这个功能。事实证明,我确实已经成功创建了列和行。我认为它不起作用,因为我试图用一种不起作用的颜色在网格中绘制一个字段。现在我想知道,为什么这不起作用,因为我认为这是正确的代码。
var converter = new System.Windows.Media.BrushConverter();
var brush1 = (Brush)converter.ConvertFromString("#FFFFFFF0");
DockPanel myDockPanel = new DockPanel();
Grid.SetColumn(myDockPanel, 3);
Grid.SetRow(myDockPanel, 3);
myDockPanel.Background = brush1;
这里出现了很多问题,这是一个奇妙的想法,为什么你想这样做,但是这应该指向一个更好的方向
一些修改
- 专用的
Grid
- 获取
ActualHeight
和ActualWidth
使用 - 设置qazxsw poi qazxsw poi,这样你就可以看到发生了什么
- 将
GridLines
对齐设置为true
- 不要改变窗户的大小
XAML
Grid
代码背后
Stretch
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Grid.Row="0"
Grid.Column="0"
BorderBrush="Black"
BorderThickness="2">
<DockPanel Grid.RowSpan="8" Background="LightSalmon">
<StackPanel>
<TextBox Name="txtColums" Text="16" />
<TextBox Name="txtRows" Text="8" />
<TextBox Name="txtWindowHeight" Text="800" />
<TextBox Name="txtWindowWidth" Text="1600" />
<Button x:Name="ButtonCreate"
Click="ButtonCreate_OnClick"
Content="Create" />
</StackPanel>
</DockPanel>
</Border>
<Grid Name="MainWindowGrid"
Grid.Row="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ShowGridLines="True" />
</Grid>
网格布局是正确的。设置public void CreateField(Grid MainGrid, TextBox Columns, TextBox Rows) // TextBox WHeight, TextBox WWidth, MainWindow MainWindow)
{
var ColumnCount = int.Parse(Columns.Text);
var RowCount = int.Parse(Rows.Text);
var width = MainGrid.ActualWidth;
var height = MainGrid.ActualHeight;
for (var a = 0; a <= ColumnCount; a++)
{
var c = new ColumnDefinition();
c.Width = new GridLength(width / ColumnCount, GridUnitType.Pixel);
MainGrid.ColumnDefinitions.Add(c);
}
for (var a = 0; a <= RowCount; a++)
{
var r = new RowDefinition();
r.Height = new GridLength(height / RowCount, GridUnitType.Pixel);
MainGrid.RowDefinitions.Add(r);
}
}
private void ButtonCreate_OnClick(object sender, RoutedEventArgs e)
{
CreateField(MainWindowGrid, txtColums, txtRows);
}
来看它
要查看动态创建的控件,您应该将其添加到网格:
由于网格行具有相等的高度且列具有相等的宽度,因此可以安全地删除以下行:
MainGrid.ShowGridLines=true;
如果未设置Width / Height,则默认为MainGrid.Children.Add(myDockPanel);
,这意味着Grid将对它们进行相同的大小调整。
作为替代,可以使用r.Height = new GridLength(WindowHeight / RowCount, GridUnitType.Pixel);
c.Width = new GridLength(WindowWidth / ColumnCount, GridUnitType.Pixel);
:
*
但在这种情况下,必须连续添加子元素
以上是关于无法在WPF中动态创建列/行的主要内容,如果未能解决你的问题,请参考以下文章