调整UserControl子级的麻烦或者使用比使用UserControl更好的方法?

时间:2016-08-20 07:07:44

标签: c# wpf xaml user-controls

我目前正在开发一个小型WPF程序,作为脱机故障单的模板和记录器。

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

Ticket (UserControl)

我的程序然后读取故障单中的每个字段并将其存储在文本文件中。

这一切都期望调整大小。 WPF很难调整大小(在我看来)。我没有太多使用WPF的经验但是我无法让UserControl在我在主窗口中使用的网格上调整大小。控件调整大小但我的用户控件的子节点都没有调整大小。

以下是我的主窗口的外观

Main Window

故障单将添加到故障单选项卡下的网格中。这里的所有内容都需要UserControl的子项(文本字段,按钮等)。

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

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

1 个答案:

答案 0 :(得分:0)

大多数WPF控件(以及用户控件)的默认行为是扩展并占用尽可能多的空间

例如

(为清楚起见,省略了xml命名空间)

<Window>
  <Button Content="Hello" />
</Window>
如果您最大化窗口,

会创建一个大按钮

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

通常,我避免使用可视化设计器,但直接使用XAML编辑器设计布局并验证它是否在Visual设计器上显示为预期。

虽然根据屏幕可用性控制扩展和收缩很好,但有时可能导致布局和大小不佳或奇怪。通常情况下,当我使用Grid作为布局时,我会设置各个孩子的MinWidthMinHeightMaxWidthMaxHeight来控制那些&# 39;拉伸或压缩太多时看起来不错(RadioButtons,CheckBox)。对于某些控件,需要仅水平拉伸(单行文本输入,例如您的情况下的问题定义字段),将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>