Wpf 表单对齐和调整大小

Wpf Form Alignment & Resize

我正在尝试在 wpf 中制作表单,但我遇到了一些对齐问题。

这种形式很特殊,因为它由一组具有不同列数的行组成。

这是我目前得到的:

我有 2 个问题。

1) 对齐

如果两行的列数不同,如何将一行中的文本框与下方行中的文本框对齐。

我想这样对齐:

T1 左侧到T3 左侧,T2 右侧到T3 右侧。 在调整大小时,T3 应该拉伸并且 T1 和 T2 彼此靠近。

2) 调整大小

每个列的高度都是父网格高度的百分比<RowDefinition Height="62*"/>,文本框和标签随VerticalAlignment="Stretch"浮动,我想当我降低高度时是否会那样做表单 TextBox 会彼此靠得更近,但它们不会,并且一些 TextBox 会从屏幕上切掉。

这是XAML代码:

<UserControl x:Class="my.Controles.Clientes.ControlVerClientes"
             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:DesignHeight="750" d:DesignWidth="1900" Loaded="ControlVerClientes_Load">
    <Grid Background="Gold" >
        <Grid Name="SubInterfazAdministrarClientes">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="55*"    />
                <ColumnDefinition Width="100*"    />
                <ColumnDefinition Width="75*"    />
            </Grid.ColumnDefinitions>
            <Grid Grid.Column ="0">
                <Grid Margin="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="40"/>
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBox x:Name="TextBoxBuscarCliente" Grid.Row="0" TextChanged="TextBoxBuscarCliente_Change"/>
                    <ListBox x:Name="ListBoxBuscarClientes" Grid.Row="1" Margin="0,20,0,0" SelectionChanged="ListBoxBuscarClientes_SelectionChanged"/>
                </Grid>
            </Grid>
            <Grid Grid.Column ="1">
                <Grid HorizontalAlignment="Stretch" Height="680" Margin="10,70,0,0" VerticalAlignment="Stretch" >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="120*"/>
                        <RowDefinition Height="65*"/>
                    </Grid.RowDefinitions>

                    <Grid Grid.Row="0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <Label Content="Nombre" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Height="24" Width="76" />
                            <TextBox HorizontalAlignment="Stretch" Height="24" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Nombre}" VerticalAlignment="Stretch" Width="220" />
                        </Grid>
                        <Grid Grid.Column="1">
                            <Label Content="Apellido" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"/>
                            <TextBox HorizontalAlignment="Stretch" Height="24" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Apellido}" VerticalAlignment="Stretch" Width="220"/>
                        </Grid>
                    </Grid>

                    <Grid  Grid.Row="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <Label Content="Documento" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"/>
                            <TextBox HorizontalAlignment="Stretch" Height="22" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Documento}" VerticalAlignment="Stretch" Width="220"/>
                        </Grid>
                        <Grid Grid.Column="1">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>

                            <Grid Grid.Column="0">
                                <Label Content="Descuento Fijo" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="124"/>
                                <TextBox HorizontalAlignment="Stretch" Height="23" Margin="0,0,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Stretch" Width="150" PreviewTextInput="TextboxValidacionNumerica"/>
                                <Label Content="%" HorizontalAlignment="Stretch" Margin="130,0,0,0" VerticalAlignment="Stretch" Height="23" Width="19" RenderTransformOrigin="0.395,0.294" Background="Transparent"/>
                            </Grid>
                            <Grid Grid.Column="1">
                                <Label Content="Estado" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="124"/>
                                <ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="23" Width="150" Text="{Binding Estado}" DisplayMemberPath="Estado" />
                            </Grid>
                        </Grid>
                    </Grid>


                    <Grid Grid.Row="2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <Label Content="Telefono 1" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Height="23"/>
                            <TextBox HorizontalAlignment="Stretch" Height="23" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Telefono1}" VerticalAlignment="Stretch" Width="220"/>
                        </Grid>
                        <Grid Grid.Column="1">
                            <Label Content="Telefono 2" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"  Height="23"/>
                            <TextBox HorizontalAlignment="Stretch" Height="24" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Telefono2}" VerticalAlignment="Stretch" Width="220"/>
                        </Grid>
                    </Grid>

                    <Grid Grid.Row="3">
                        <Label Content="Email" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"  Height="23"/>
                        <TextBox HorizontalAlignment="Stretch" Height="24" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Email}" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>

                    <Grid Grid.Row="4">
                        <Label Content="Direccion" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"/>
                        <TextBox HorizontalAlignment="Stretch" Height="22" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Direccion}" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>


                    <Grid Grid.Row="5">
                        <Label Content="Hotel/Habitacion" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"/>
                        <TextBox HorizontalAlignment="Stretch" Height="22" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Hotel_Habitacion}" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>

                    <Grid Grid.Row="6">
                        <Label Content="Contacto" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="138"/>
                        <TextBox HorizontalAlignment="Stretch" Height="96" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding ClienteActual.Contacto}" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>
                    <Grid Grid.Row="7">
                        <Label Content="{Binding ClienteActual.InfoCreacion}" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>


                </Grid>

            </Grid>
        </Grid>
    </Grid>
</UserControl>

此外,如果您知道更好的方法,我很想听听。 非常感谢!!

1.对齐方式

为此,您需要删除 Width,设置 HorizontalAlignment = Strecth,并匹配 T2 和 T3 的右边距。

2。推荐布局

<Window ...>
    <Grid Background="Gold" >
        <Grid Name="SubInterfazAdministrarClientes">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="34*"    />
                <ColumnDefinition Width="102*"    />
                <ColumnDefinition Width="37*"    />
            </Grid.ColumnDefinitions>
            <Grid Grid.Column ="0">
                <Grid Margin="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="40"/>
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBox x:Name="TextBoxBuscarCliente" Grid.Row="0" />
                    <ListBox x:Name="ListBoxBuscarClientes" Grid.Row="1" Margin="0,20,0,0" />
                </Grid>
            </Grid>
            <Grid Grid.Column ="1">
                <Grid HorizontalAlignment="Stretch" Height="680" Margin="10,70,0,0" VerticalAlignment="Stretch" >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="62*"/>
                        <RowDefinition Height="61*"/>
                        <RowDefinition Height="120*"/>
                        <RowDefinition Height="65*"/>
                    </Grid.RowDefinitions>

                    <Grid Grid.Row="0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <StackPanel Margin="10">
                                <Label Content="Nombre"/>
                                <TextBox TextWrapping="Wrap" Text="{Binding ClienteActual.Nombre}"/>
                            </StackPanel>
                        </Grid>
                        <Grid Grid.Column="1">
                            <StackPanel Margin="10">
                                <Label Content="Apellido"  />
                                <TextBox HorizontalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding ClienteActual.Apellido}"/>
                            </StackPanel>
                        </Grid>
                    </Grid>

                    <Grid  Grid.Row="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <StackPanel Orientation="Vertical" Margin="10">
                                <Label Content="Documento" />
                                <TextBox TextWrapping="Wrap" Text="{Binding ClienteActual.Documento}"/>
                            </StackPanel>
                        </Grid>
                        <Grid Grid.Column="1">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="108*" />
                                <ColumnDefinition Width="91*" />
                            </Grid.ColumnDefinitions>

                            <Grid Grid.Column="0">
                                <StackPanel Orientation="Vertical" Margin="10">
                                    <Label Content="Descuento Fijo"/>
                                    <TextBox  TextWrapping="Wrap" Text="0" />
                                    <Label Content="%"  Background="Transparent" />
                                </StackPanel>
                            </Grid>
                            <Grid Grid.Column="1">
                                <StackPanel Margin="10">
                                    <Label Content="Estado" />
                                    <ComboBox Text="{Binding Estado}" DisplayMemberPath="Estado" />
                                </StackPanel>
                            </Grid>
                        </Grid>
                    </Grid>

                    <Grid Grid.Row="2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="135*"/>
                            <ColumnDefinition Width="148*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <StackPanel Orientation="Vertical" Margin="10">
                                <Label Content="Telefono 1" />
                                <TextBox TextWrapping="Wrap" Text="{Binding ClienteActual.Telefono1}" />
                            </StackPanel>
                        </Grid>
                        <Grid Grid.Column="1">
                            <StackPanel Margin="10">
                                <Label Content="Telefono 2"/>
                                <TextBox Text="{Binding ClienteActual.Telefono2}"/>
                            </StackPanel>
                        </Grid>
                    </Grid>

                    <Grid Grid.Row="3">
                        <StackPanel Margin="10">
                            <Label Content="Email" DockPanel.Dock="Left" />
                            <TextBox DockPanel.Dock="Left" TextWrapping="Wrap" Text="{Binding ClienteActual.Email}" />
                        </StackPanel>
                    </Grid>

                    <Grid Grid.Row="4">
                        <StackPanel Margin="10">
                            <Label Content="Direccion" />
                            <TextBox TextWrapping="Wrap" Text="{Binding ClienteActual.Direccion}" />
                        </StackPanel>
                    </Grid>

                    <Grid Grid.Row="5">
                        <StackPanel Margin="10">
                            <Label Content="Hotel/Habitacion"/>
                            <TextBox TextWrapping="Wrap" Text="{Binding ClienteActual.Hotel_Habitacion}" />
                        </StackPanel>
                    </Grid>

                    <Grid Grid.Row="6">
                        <StackPanel Margin="10">
                            <Label Content="Contacto"/>
                            <TextBox Height="96" TextWrapping="Wrap" Text="{Binding ClienteActual.Contacto}"/>
                        </StackPanel>
                    </Grid>

                    <Grid Grid.Row="7">
                        <Label Content="{Binding ClienteActual.InfoCreacion}" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="578"/>
                    </Grid>

                </Grid>

            </Grid>
        </Grid>
    </Grid>
</Window>

如果您希望在调整大小时 Window 折叠行高,那可能不是最好的做法,因为必须有一些有意义的高度,低于该高度时表格将变得无用。您可以试验 MinHeight 个值。