我的MainWindow是使用TabContol构建的,它包含在xaml文件的每个选项卡UserControl中。打开特定的UserControl没问题,但是对齐它就可以了。我能够将标签的内容水平居中,但很难做到垂直。我发现根本的问题是UserControl不会占用Tab中的整个可用空间(高度)。我试图将主网格设置为VerticalAlignment =“ Stretch”和“ Center”,但这没有帮助。我可以使用带有特定数字的边距或定义固定的高行,但是这不适用于每种分辨率,并且我不想在后面的代码中编写方法,而是使用xaml的功能。如何强制UserControl在Tab中占据整个高度,然后垂直居中(对特定的UserControl这样做很重要,因为其他用户应该具有默认位置)?
ps。我正在使用MahApps.Metro的MetroWindow。
MainWindow主网格:
<Grid>
<StackPanel>
<TabControl ItemsSource="{Binding Tabs}"
SelectedIndex="0">
<TabControl.Resources>
<Style TargetType="{x:Type TabPanel}">
<Setter Property="HorizontalAlignment"
Value="Center" />
</Style>
<DataTemplate DataType="{x:Type VMod:LoginViewModel}">
<Pages:LoginView />
</DataTemplate>
<DataTemplate DataType="{x:Type VMod:AdminViewModel}">
<Pages:AdminView />
</DataTemplate>
<DataTemplate DataType="{x:Type VMod:ProductsViewModel}">
<Pages:ProductsView />
</DataTemplate>
<DataTemplate DataType="{x:Type VMod:DistributionViewModel}">
<Pages:DistributionView />
</DataTemplate>
<DataTemplate DataType="{x:Type VMod:SummaryViewModel}">
<Pages:SummaryView />
</DataTemplate>
<DataTemplate DataType="{x:Type VMod:SettingsViewModel}">
<Pages:SettingsView />
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate DataType="{x:Type inter:ITab}">
<TextBlock>
<Run Text="{Binding TabName}" />
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</StackPanel>
</Grid>
UserControl主网格:
<Grid Background="LightBlue"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Height="300"
Width="300"
Grid.Row="2"
BorderBrush="LightGray"
BorderThickness="1">
<StackPanel HorizontalAlignment="Center">
<iconPacks:PackIconRPGAwesome Kind="Honeycomb"
HorizontalAlignment="Center"
Width="60"
Height="60"
Margin="0, 0, 0, 0"/>
<TextBlock HorizontalAlignment="Center"
Text="DistributionTool"
FontSize="20"
FontWeight="Bold"
Margin="5" />
<Grid Width="200">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
Margin="5"
TextAlignment="Left"
FontSize="15"/>
<iconPacks:PackIconMaterial Grid.Column="1"
Kind="AccountTie"
Width="20"
Height="20"
VerticalAlignment="Center"/>
</Grid>
<Grid Width="200">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<PasswordBox Grid.Column="0"
Margin="5"
HorizontalContentAlignment="Left"
FontSize="15"
Style="{StaticResource Win8MetroPasswordBox}" />
<iconPacks:PackIconMaterial Grid.Column="1"
Kind="Key"
Width="20"
Height="20"
VerticalAlignment="Center" />
</Grid>
<Button Content="LOGIN"
Width="80"
metro:ControlsHelper.ContentCharacterCasing="Normal"
Margin="5"
Style="{StaticResource AccentedSquareButtonStyle}" />
</StackPanel>
</Border>
</Grid>
根据我的收集,您可以尝试的是:
StackPanel
中删除Grid
。除非您打算在堆栈面板中有一个以上的孩子(TabControl
除外),否则它是无用的。VerticalAlignement="Stretch"
添加到TabControl
。这将使其能够垂直占据所有空间。然后您应该已经准备就绪。
您不应该使用StackPanel
的原因除非您打算像在其中那样堆叠项目
<StackPanel>
<Child1/>
<Child2/>
</StackPanel>
是StackPanel.Orientation
属性会影响事物在内部的显示方式,包括每个子项的对齐方式。因此,Orientation="Vertical"
(默认值)会影响其子级的VerticalAlignement
。与Horizontal
相同的想法。