调整UserControl子控件大小的麻烦,或者可能是比使用UserControl更好的方法
本文关键字:UserControl 方法 更好 控件 调整 麻烦 或者 | 更新日期: 2023-09-27 18:03:17
我目前正在开发一个小的WPF程序,作为模板和离线门票记录。
我的程序的设计目前是基于创建一个用户控件作为票证。这个票据(UserControl)是一组文本字段。这是我的usercontrol的截图。
票(用户)
然后我的程序读取票证中的每个字段并将其存储在一个文本文件中。
除了调整大小之外,这些都可以工作。WPF是一个痛苦的调整(在我看来)。我对WPF没有太多的经验,但我不能让UserControl调整我在主窗口中使用的网格的大小。控件会调整大小,但我的用户控件的所有子控件都不会调整大小。
这是我的主窗口的样子
主窗口票据被添加到票据选项卡下的网格中。除了UserControl的子控件(textfield, button等),这里的所有东西都可以调整大小。
问题:是否有更好的方法来制作这样的东西(IE不使用用户控件),或者我只需要使用一个凌乱的网格,以及大量的拉伸和自动属性在我的UserControl和她的孩子得到这个工作?
也许我只是在这种情况下使用UserControls完全错误。
大多数WPF控件(因此也是用户控件)的默认行为是展开并占用尽可能多的可用空间
例如(为清晰起见省略了xml名称空间)
<Window>
<Button Content="Hello" />
</Window>
将创建一个大按钮如果你最大化你的窗口
在你的情况下,我猜你正在使用Visual Studio设计器来对齐和调整单个控件的大小。设计师生成代码的一个行为是,如果你移动控件来定位它们,设置Margin
属性,如果你调整大小,设置Width
和Height
属性。这会导致它们停止膨胀或拉伸。
通常,我避免使用视觉设计器,而是直接使用XAML编辑器来设计布局,并验证它是否在视觉设计器上显示。
虽然根据屏幕可用性扩展和收缩控件很好,但有时可能会导致糟糕或奇怪的布局和大小。通常,当我使用Grid
作为布局时,我为拉伸或压缩太多(单选按钮,复选框)时看起来不太好的控件设置单个子MinWidth
, MinHeight
, MaxWidth
和MaxHeight
。对于某些控件,最好只水平拉伸(单行文本输入,例如在您的情况下的问题定义字段),将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>