调整UserControl子控件大小的麻烦,或者可能是比使用UserControl更好的方法

本文关键字:UserControl 方法 更好 控件 调整 麻烦 或者 | 更新日期: 2023-09-27 18:03:17

我目前正在开发一个小的WPF程序,作为模板和离线门票记录。

我的程序的设计目前是基于创建一个用户控件作为票证。这个票据(UserControl)是一组文本字段。这是我的usercontrol的截图。

票(用户)

然后我的程序读取票证中的每个字段并将其存储在一个文本文件中。

除了调整大小之外,这些都可以工作。WPF是一个痛苦的调整(在我看来)。我对WPF没有太多的经验,但我不能让UserControl调整我在主窗口中使用的网格的大小。控件会调整大小,但我的用户控件的所有子控件都不会调整大小。

这是我的主窗口的样子

主窗口

票据被添加到票据选项卡下的网格中。除了UserControl的子控件(textfield, button等),这里的所有东西都可以调整大小。

问题:是否有更好的方法来制作这样的东西(IE不使用用户控件),或者我只需要使用一个凌乱的网格,以及大量的拉伸和自动属性在我的UserControl和她的孩子得到这个工作?

也许我只是在这种情况下使用UserControls完全错误。

调整UserControl子控件大小的麻烦,或者可能是比使用UserControl更好的方法

大多数WPF控件(因此也是用户控件)的默认行为是展开并占用尽可能多的可用空间

例如

(为清晰起见省略了xml名称空间)

<Window>
  <Button Content="Hello" />
</Window>

将创建一个大按钮如果你最大化你的窗口

在你的情况下,我猜你正在使用Visual Studio设计器来对齐和调整单个控件的大小。设计师生成代码的一个行为是,如果你移动控件来定位它们,设置Margin属性,如果你调整大小,设置WidthHeight属性。这会导致它们停止膨胀或拉伸。

通常,我避免使用视觉设计器,而是直接使用XAML编辑器来设计布局,并验证它是否在视觉设计器上显示。

虽然根据屏幕可用性扩展和收缩控件很好,但有时可能会导致糟糕或奇怪的布局和大小。通常,当我使用Grid作为布局时,我为拉伸或压缩太多(单选按钮,复选框)时看起来不太好的控件设置单个子MinWidth, MinHeight, MaxWidthMaxHeight。对于某些控件,最好只水平拉伸(单行文本输入,例如在您的情况下的问题定义字段),将Grid行高度设置为auto将是谨慎的,以便控件获得所需的足够高度。

它也可以使用GridSplitter与合理的最小/最大宽度限制,允许用户调整LHS列的大小,如果他的窗口大小太小

类似这样的内容(未经过测试)

<Window>
  <Window.Resources>
    <Style TargetType="TextBox">
      <Setter Property="Margin" Value="5" />
    </Style>
    <Style TargetType="Button">
      <Setter Property="Margin" Value="5" />
    </Style>
    <Style TargetType="TextBlock">
      <Setter Property="Margin" Value="5" />
      <Setter Property="FontWeight" Value="Bold"/>              
    </Style>
  </Window.Resources>
  <Grid>  
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="0.3*" MinWidth="200" MaxWidth="350" />
      <ColumnDefinition Width="0.7*" />
    </Grid.ColumnDefinitions>    
    <Grid.RowDefinitions>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="*"/>
      <RowDefinition Height="auto"/>
      <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <!-- first column -->
    <TextBlock Grid.Column="0"
               Grid.Row="0"
               Text="Employee ID" />
    <TextBox Grid.Column="0"
             Grid.Row="1"
             Text="{Binding EmployeeID}" />
    <TextBlock Grid.Column="0"
               Grid.Row="2"
               Text="User Name" />
    <TextBox Grid.Column="0"
             Grid.Row="3"
             Text="{Binding UseName}" />
    <TextBlock Grid.Column="0"
               Grid.Row="4"
               Text="Computer Name" />
    <TextBox Grid.Column="0"
              Grid.Row="5"
              Text="{Binding ComputerName}" />
    <TextBlock Grid.Column="0"
               Grid.Row="6"
               Text="PhoneNumber" />
    <TextBox Grid.Column="0"
              Grid.Row="7"
              Text="{Binding PhoneNumber}" />
    <TextBlock Grid.Column="0"
               Grid.Row="8"
               Text="Location" />
    <TextBox Grid.Column="0"
             Grid.Row="9"
             Grid.RowSpan="2"
             Text="{Binding Location}" />
    <Button Grid.Column="0"
            Grid.Row="11"
            Text="Copy All" />
    <!-- second column -->
    <TextBlock Grid.Column="1"
               Grid.Row="0"
               Text="Problem Description" />
    <Grid Grid.Column="1"
          Grid.Row="1">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
      </Grid.ColumnDefinitions>    
      <TextBox Grid.Column="0"
               Text="{Binding ProblemDescription}" />    
      <Button Grid.Column="1"
              Content="C" />
    </Grid>
    <TextBlock Grid.Column="1"
               Grid.Row="2"
               Text="Notes" />
    <TextBox Grid.Column="0"
             Grid.Row="3"
             Grid.RowSpan="7"
             Text="{Binding Notes}" />    
    <TextBlock Grid.Column="1"
               Grid.Row="10"
               Text="Resolution" />
    <Grid Grid.Column="1"
          Grid.Row="11">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
      </Grid.ColumnDefinitions>    
      <TextBox Grid.Column="0"
               Text="{Binding Resolution}" />    
      <Button Grid.Column="1"
              Content="C" />
    </Grid>
    <!-- splitter to make the columns resizable -->
    <GridSplitter Grid.Column="1"
                  Grid.Row="0"
                  Grid.RowSpan="12"
                  Width="3"
                  Background="Blue" />    
  </Grid>
</Window>