我目前正在开发一个小型WPF程序,作为脱机故障单的模板和记录器。
我的程序设计目前基于创建用户控件作为故障单。此票证(UserControl)是一组文本字段。这是我的usercontrol的截图。
我的程序然后读取故障单中的每个字段并将其存储在文本文件中。
这一切都期望调整大小。 WPF很难调整大小(在我看来)。我没有太多使用WPF的经验但是我无法让UserControl在我在主窗口中使用的网格上调整大小。控件调整大小但我的用户控件的子节点都没有调整大小。
以下是我的主窗口的外观
故障单将添加到故障单选项卡下的网格中。这里的所有内容都需要UserControl的子项(文本字段,按钮等)。
问题:有没有更好的方法来制作这样的东西(IE不使用用户控件)或者我只需要使用凌乱的网格,以及大量的拉伸和自动属性我的UserControl和她的孩子们让这个工作?
也许我只是在这种情况下使用UserControls完全错误。
答案 0 :(得分:0)
大多数WPF控件(以及用户控件)的默认行为是扩展并占用尽可能多的空间
例如(为清楚起见,省略了xml命名空间)
<Window>
<Button Content="Hello" />
</Window>
如果您最大化窗口,会创建一个大按钮
在您的情况下,我猜您正在使用Visual Studio设计器来对齐和调整各个控件的大小。设计器生成代码的一个行为是设置Margin
属性,如果您移动控件以定位它们,如果调整大小,则设置Width
和Height
。这导致他们停止扩张或拉伸。
通常,我避免使用可视化设计器,但直接使用XAML编辑器设计布局并验证它是否在Visual设计器上显示为预期。
虽然根据屏幕可用性控制扩展和收缩很好,但有时可能导致布局和大小不佳或奇怪。通常情况下,当我使用Grid
作为布局时,我会设置各个孩子的MinWidth
,MinHeight
,MaxWidth
和MaxHeight
来控制那些&# 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>