C# 在wpf窗口中添加大量文本框的最佳方法是什么

C# 在wpf窗口中添加大量文本框的最佳方法是什么,c#,wpf,C#,Wpf,我正试图使一个WPF窗口将全屏(不包括任务栏),并将包含大量的文本框 我以前在winforms中做过这个。但是在winforms中,很容易制作并将所有元素放在groupbox中以使其看起来更好,但是如何在WPF中做到这一点,因为在WPF中groupbox可以包含单个项 我想做这样的东西: .... .... .... 如果列表长度固定,则将文本框放在另一个容器中,如网格、StackPanel或WrapPanel: <GroupBox Header="Student Details">

我正试图使一个WPF窗口将全屏(不包括任务栏),并将包含大量的文本框

我以前在winforms中做过这个。但是在winforms中,很容易制作并将所有元素放在groupbox中以使其看起来更好,但是如何在WPF中做到这一点,因为在WPF中groupbox可以包含单个项

我想做这样的东西:


....
....
....

如果列表长度固定,则将文本框放在另一个容器中,如网格、StackPanel或WrapPanel:

<GroupBox Header="Student Details">>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            ... as many RowDefinitions as you need
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            ... as many ColumnDefinitions as you need
        </Grid.ColumnDefinitions>
        <GroupBox Grid.Column="0" Grid.Row="0">
            <StackPanel Orientation="Horizontal">
                <TextBlock .../>
                <TextBox .../>
                <TextBox .../>
            </StackPanel>
        </GroupBox>
        <GroupBox Grid.Column="0" Grid.Row="1">
            <StackPanel Orientation="Horizontal">
                <TextBlock .../>
                <TextBox .../>
                <TextBox .../>
            </StackPanel>
        </GroupBox>
        ...
    </Grid>
</GroupBox>
>
... 需要多少行定义就有多少行定义
... 需要多少列定义就有多少列定义
...
因此,虽然GroupBox只能包含一个子对象,但没有什么可以阻止该子对象成为另一个容器类型的对象,该对象可以包含您需要的所有元素

我在这里使用网格纯粹是为了说明。最终使用的容器取决于文本框和标签的布局方式。网格使您能够更好地控制元素的布局,但从堆栈面板添加和删除元素更容易—您不必添加新的行或列定义

但是,如果列表长度可变,则最好为列表项创建数据模板:

<DataTemplate x:Key="ListTemplate">
    <GroupBox>
        <StackPanel Orientation="Horizontal">
            <TextBlock .../>
            <TextBox .../>
            <TextBox .../>
        </StackPanel>
    </GroupBox>
</DataTemplate>

然后使用绑定在列表中显示元素:

<GroupBox Header=Student Details">
    <ListBox ItemsSource={Binding StudentList}">
        <ListBox.ItemTemplate>
             ....
        </ListBox.ItemTemplate/>
    </ListBox>
</GroupBox>

....

我找到了以下解决方案



我希望它能对您有所帮助。

您可以创建一个UserControl,用这个xaml内容表示您的学生数据:

StudentControl.xaml

<UserControl x:Class="YourNamespace.StudentControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignWidth="300">
<GroupBox Margin="3">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Label Content="Student 1" x:Name="StudentLabel" FontWeight="Bold"></Label>
            <TextBox Grid.Column="1" Text="name" Margin="3"></TextBox>
            <TextBox Grid.Column="2" Text="email" Margin="3"></TextBox>
        </Grid>
    </GroupBox>
</UserControl>
然后在主窗口中,这是您需要的所有标记:

<Grid VerticalAlignment="Top">
    <GroupBox Header="Student Details">
        <UniformGrid x:Name="StudentGrid" Columns="2" />
    </GroupBox>
</Grid>

并且在代码隐藏文件(MainWindow.xaml.cs)中:

public MainWindow()
{
    InitializeComponent();

    for (var i = 0; i < 20; i++)
        StudentGrid.Children.Add(new StudentControl($"Student{i + 1}"));
}
public主窗口()
{
初始化组件();
对于(变量i=0;i<20;i++)
添加(新的StudentControl($“Student{i+1}”);
}
如果您希望拥有网格布局的强大功能,但确实希望为所有用户控件平均分配空间,那么使用UniformGrid非常好


希望这有帮助

我发现了以下内容,希望能对你有所帮助。谢谢。盒子的大小如何。我想把它放在整个窗户里。我应该把它们拖走还是。。默认情况下,如何调整长方体的大小GroupBox拉伸。例如,在GroupBox内部,您可以使用带有列的网格
using System.Windows.Controls;

namespace YourNamespace
{
    public partial class StudentControl : UserControl
    {
        public StudentControl(string labelText)
        {
            InitializeComponent();

            StudentLabel.Content = labelText;
        }
    }
}
<Grid VerticalAlignment="Top">
    <GroupBox Header="Student Details">
        <UniformGrid x:Name="StudentGrid" Columns="2" />
    </GroupBox>
</Grid>
public MainWindow()
{
    InitializeComponent();

    for (var i = 0; i < 20; i++)
        StudentGrid.Children.Add(new StudentControl($"Student{i + 1}"));
}