如何在TabControl中将UserControl居中

问题描述 投票:0回答:1

我的MainWindow是使用TabContol构建的,它包含在xaml文件的每个选项卡UserControl中。打开特定的UserControl没问题,但是对齐它就可以了。我能够将标签的内容水平居中,但很难做到垂直。我发现根本的问题是UserControl不会占用Tab中的整个可用空间(高度)。我试图将主网格设置为VerticalAlignment =“ Stretch”和“ Center”,但这没有帮助。我可以使用带有特定数字的边距或定义固定的高行,但是这不适用于每种分辨率,并且我不想在后面的代码中编写方法,而是使用xaml的功能。如何强制UserControl在Tab中占据整个高度,然后垂直居中(对特定的UserControl这样做很重要,因为其他用户应该具有默认位置)?

ps。我正在使用MahApps.Metro的MetroWindow。

enter image description here

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>
wpf tabs user-controls vertical-alignment tabcontrol
1个回答
0
投票

根据我的收集,您可以尝试的是:

  1. 在主窗口StackPanel中删除Grid。除非您打算在堆栈面板中有一个以上的孩子(TabControl除外),否则它是无用的。
  2. VerticalAlignement="Stretch"添加到TabControl。这将使其能够垂直占据所有空间。

然后您应该已经准备就绪。

您不应该使用StackPanel的原因除非您打算像在其中那样堆叠项目

<StackPanel>
<Child1/>
<Child2/>
</StackPanel>

StackPanel.Orientation属性会影响事物在内部的显示方式,包括每个子项的对齐方式。因此,Orientation="Vertical"(默认值)会影响其子级的VerticalAlignement。与Horizontal相同的想法。

© www.soinside.com 2019 - 2024. All rights reserved.