HorizontalAlignment Stretch does not work as expec

2019-09-15 10:10发布

问题:

I have overridden the default style of PasswordBox to achieve the center alignment of the text. Below is the code I have:

<Page.Resources>
        <Style x:Key="PasswordStyle" TargetType="PasswordBox">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="PasswordBox">
                    <Grid Background="White" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
                        <Grid.Resources>
                            <Style x:Name="RevealButtonStyle" TargetType="Button">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="Button">
                                            <Grid x:Name="ButtonLayoutGrid" BorderBrush="{ThemeResource TextBoxButtonBorderThemeBrush}"
                                                BorderThickness="{TemplateBinding BorderThickness}"
                                                Background="{ThemeResource TextBoxButtonBackgroundThemeBrush}">

                                                <TextBlock 
                                                x:Name="GlyphElement"
                                                Foreground="{ThemeResource SystemControlForegroundChromeBlackMediumBrush}"
                                                VerticalAlignment="Center"
                                                HorizontalAlignment="Center"
                                                FontStyle="Normal"
                                                FontSize="16"
                                                Text="&#xE052;"
                                                FontFamily="{ThemeResource SymbolThemeFontFamily}"
                                                AutomationProperties.AccessibilityView="Raw"/>
                                            </Grid>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Grid.Resources>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Border 
                        x:Name="BackgroundElement"
                        Grid.Row="1"
                        Background="{TemplateBinding Background}"
                        Margin="{TemplateBinding BorderThickness}"
                        Opacity="{ThemeResource TextControlBackgroundRestOpacity}"
                        Grid.ColumnSpan="2"/>
                        <Border x:Name="BorderElement"
                        Grid.Row="1"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Grid.ColumnSpan="2"/>
                        <ContentPresenter x:Name="HeaderContentPresenter"
                        x:DeferLoadStrategy="Lazy"
                        Visibility="Collapsed"
                        Grid.Row="0"
                        Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}"
                        Margin="0,0,0,8"
                        Grid.ColumnSpan="2"
                        Content="{TemplateBinding Header}"
                        ContentTemplate="{TemplateBinding HeaderTemplate}"
                        FontWeight="Normal" />
                        <ScrollViewer
                        x:Name="ContentElement"
                        Grid.Row="1"
                        HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
                        HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                        VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
                        VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                        IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
                        IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
                        Margin="{TemplateBinding BorderThickness}"
                        Padding="{TemplateBinding Padding}"
                        IsTabStop="False"
                        ZoomMode="Disabled"
                        AutomationProperties.AccessibilityView="Raw"/>
                        <ContentControl x:Name="PlaceholderTextContentPresenter"
                        Grid.Row="1"
                        Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
                        Margin="{TemplateBinding BorderThickness}"
                        Padding="{TemplateBinding Padding}"
                        IsTabStop="False"
                        Grid.ColumnSpan="2"
                        Content="{TemplateBinding PlaceholderText}"
                        IsHitTestVisible="False"/>
                        <Button x:Name="RevealButton"
                        Grid.Row="1"
                        Style="{StaticResource RevealButtonStyle}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Margin="{ThemeResource HelperButtonThemePadding}"
                        IsTabStop="False"
                        Grid.Column="1"
                        Visibility="Collapsed"
                        FontSize="{TemplateBinding FontSize}"
                        VerticalAlignment="Stretch"
                        MinWidth="34" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    </Page.Resources>
    <Grid 
        VerticalAlignment="Center"
        HorizontalAlignment="Stretch"
        Background="White">


        <Grid Background="Aqua" HorizontalAlignment="Stretch">
            <PasswordBox Style="{StaticResource PasswordStyle}"></PasswordBox>
        </Grid>
    </Grid>

Now, the problem is, the PasswordBox shrinks to the width of entered text instead of stretching to the entire width of the Grid. How can I fix it?

回答1:

Now, the problem is, the PasswordBox shrinks to the width of entered text instead of stretching to the entire width of the Grid. How can I fix it?

You need to remove the HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" of PasswordBox's root Grid of ControlTemplate:

...
<Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="PasswordBox">
                <Grid Background="White"> // remove the HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" here.
                    <Grid.Resources>
                        <Style x:Name="RevealButtonStyle" TargetType="Button">
                            <Setter Property="Template">
                                <Setter.Value>
...

This will make the PasswordBox strech to the entire Grid.

And to achieve the center alignment of the text, you need to add HorizontalAlignment="Center" to the ScrollViewer:

<ScrollViewer
     HorizontalAlignment="Center" // added HorizontalAlignment="Center"
     x:Name="ContentElement"
     Grid.Row="1"
...

So the fixed XAML will look like this:

<Page.Resources>
    <Style x:Key="PasswordStyle" TargetType="PasswordBox">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="PasswordBox">
                    <Grid Background="White">
                        <Grid.Resources>
                            <Style x:Name="RevealButtonStyle" TargetType="Button">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="Button">
                                            <Grid x:Name="ButtonLayoutGrid" BorderBrush="{ThemeResource TextBoxButtonBorderThemeBrush}"
                                            BorderThickness="{TemplateBinding BorderThickness}"
                                            Background="{ThemeResource TextBoxButtonBackgroundThemeBrush}">

                                                <TextBlock 
                                            x:Name="GlyphElement"
                                            Foreground="{ThemeResource SystemControlForegroundChromeBlackMediumBrush}"
                                            VerticalAlignment="Center"
                                            HorizontalAlignment="Center"
                                            FontStyle="Normal"
                                            FontSize="16"
                                            Text="&#xE052;"
                                            FontFamily="{ThemeResource SymbolThemeFontFamily}"
                                            AutomationProperties.AccessibilityView="Raw"/>
                                            </Grid>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Grid.Resources>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Border 
                    x:Name="BackgroundElement"
                    Grid.Row="1"
                    Background="{TemplateBinding Background}"
                    Margin="{TemplateBinding BorderThickness}"
                    Opacity="{ThemeResource TextControlBackgroundRestOpacity}"
                    Grid.ColumnSpan="2"/>
                        <Border x:Name="BorderElement"
                    Grid.Row="1"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Grid.ColumnSpan="2"/>
                        <ContentPresenter x:Name="HeaderContentPresenter"
                    x:DeferLoadStrategy="Lazy"
                    Visibility="Collapsed"
                    Grid.Row="0"
                    Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}"
                    Margin="0,0,0,8"
                    Grid.ColumnSpan="2"
                    Content="{TemplateBinding Header}"
                    ContentTemplate="{TemplateBinding HeaderTemplate}"
                    FontWeight="Normal" />
                        <ScrollViewer
                    HorizontalAlignment="Center"
                    x:Name="ContentElement"
                    Grid.Row="1"
                    HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
                    HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                    VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
                    VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                    IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
                    IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
                    Margin="{TemplateBinding BorderThickness}"
                    Padding="{TemplateBinding Padding}"
                    IsTabStop="False"
                    ZoomMode="Disabled"
                    AutomationProperties.AccessibilityView="Raw"/>
                        <ContentControl x:Name="PlaceholderTextContentPresenter"
                    Grid.Row="1"
                    Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
                    Margin="{TemplateBinding BorderThickness}"
                    Padding="{TemplateBinding Padding}"
                    IsTabStop="False"
                    Grid.ColumnSpan="2"
                    Content="{TemplateBinding PlaceholderText}"
                    IsHitTestVisible="False"/>
                        <Button x:Name="RevealButton"
                    Grid.Row="1"
                    Style="{StaticResource RevealButtonStyle}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Margin="{ThemeResource HelperButtonThemePadding}"
                    IsTabStop="False"
                    Grid.Column="1"
                    Visibility="Collapsed"
                    FontSize="{TemplateBinding FontSize}"
                    VerticalAlignment="Stretch"
                    MinWidth="34" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>
<Grid 
    VerticalAlignment="Center"
    HorizontalAlignment="Stretch"
    Background="White">


    <Grid Background="Aqua" HorizontalAlignment="Stretch">
        <PasswordBox Style="{StaticResource PasswordStyle}"></PasswordBox>
    </Grid>
</Grid>

And here is the result:



标签: xaml uwp