WPF:设置 GridViewColumn 的文本对齐方式

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3214270/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 21:55:17  来源:igfitidea点击:

WPF: Setting the text alignment of a GridViewColumn

wpfxamllistview

提问by Saulius Valatka

By default, text is centered in the headers of a ListView(notin the content cells!), I've been struggling to make it left aligned, here's what I've come up with:

默认情况下,文本在 a 的标题中居中ListView而不是在内容单元格中!),我一直在努力使其左对齐,这是我想出的:

<ListView.Resources>
    <DataTemplate x:Key="Templ">
       <TextBlock HorizontalAlignment="Left" Text="{Binding}"/>
    </DataTemplate>
</ListView.Resources>   
...
<GridViewColumn HeaderTemplate="{StaticResource Templ}">File</GridViewColumn>

This does seem to be the right place to alter the appearance of the header, since I can change other properties like Margin, etc., yet it does not respond to the HorizontalAlignmentproperty! I'm guessing the textbox is sized to content and itself centered, thus making the alignment property redundant.

这似乎是更改标题外观的正确位置,因为我可以更改其他属性,例如Margin等,但它不响应该HorizontalAlignment属性!我猜文本框的大小与内容一致,并且本身居中,从而使对齐属性变得多余。

How can I make the text left aligned ?

如何使文本左对齐?

回答by Quartermeister

Set the HeaderContainerStyleto a style that sets HorizontalContentAlignmentto left:

HeaderContainerStyle设置为将Horizo​​ntalContentAlignment设置为左的样式:

<ListView.Resources>
    <DataTemplate x:Key="Templ">
        <TextBlock HorizontalAlignment="Left" Text="{Binding}"/>
    </DataTemplate>
    <Style x:Key="HeaderStyle" TargetType="GridViewColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
    </Style>
</ListView.Resources>
<ListView.View>
    <GridView>
        <GridView.Columns>
            <GridViewColumn HeaderTemplate="{StaticResource Templ}" HeaderContainerStyle="{StaticResource HeaderStyle}">File</GridViewColumn>
        </GridView.Columns>
    </GridView>
</ListView.View>

回答by Jake Berger

Here's an attached property for setting the header's content alignment:

这是用于设置标题内容对齐的附加属性:

    #region HeaderContentAlignment

    /// <summary>Gets a <see cref="GridViewColumn"/>'s header content alignment.</summary>
    [Category("Common")]
    [AttachedPropertyBrowsableForType(typeof(GridViewColumn))]
    public static HorizontalAlignment GetHeaderContentAlignment(GridViewColumn gridViewColumn)
    {
        return (HorizontalAlignment)gridViewColumn.GetValue(HeaderContentAlignmentProperty);
    }
    /// <summary>Sets a <see cref="GridViewColumn"/>'s header content alignment.</summary>
    public static void SetHeaderContentAlignment(GridViewColumn gridViewColumn, HorizontalAlignment value)
    {
        gridViewColumn.SetValue(HeaderContentAlignmentProperty, value);
    }

    /// <summary>Indicates a <see cref="GridViewColumn"/>'s <see cref="GridViewColumn.HeaderContainerStyle"/>.</summary>
    public static readonly DependencyProperty HeaderContentAlignmentProperty = 
        DependencyProperty.RegisterAttached(
            "HeaderContentAlignment",
            typeof(HorizontalAlignment), // type
            typeof(GridViewExtensions), // containing static class
            new PropertyMetadata(HorizontalAlignment.Center, OnHeaderContentAlignmentChanged)
            );

    private static void OnHeaderContentAlignmentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        OnHeaderContentAlignmentChanged((GridViewColumn)d, (HorizontalAlignment)e.NewValue);
    }

    private static void OnHeaderContentAlignmentChanged(GridViewColumn gridViewColumn, HorizontalAlignment alignment)
    {
        Style style;
        if (ColumnHeaderAlignments.TryGetValue(alignment, out style) == false)
        {// style NOT created -> create, cache
            style = new Style(typeof(GridViewColumnHeader));
            style.Setters.Add(new Setter(Control.HorizontalContentAlignmentProperty, alignment));
            ColumnHeaderAlignments.Add(alignment, style);
        }
        gridViewColumn.HeaderContainerStyle = style;
    }

    /// <summary>cache [HorizontalAlignment]: [Style]</summary>
    static readonly Dictionary<HorizontalAlignment, Style> ColumnHeaderAlignments = new Dictionary<HorizontalAlignment, Style>(4);

    #endregion HeaderContentAlignment

回答by Usman Ali

This may help someone else, as i was struggling too, the best way is to define style for GridViewColumn.

这可能对其他人有所帮助,因为我也在苦苦挣扎,最好的方法是为 GridViewColumn 定义样式。

You can set a style to apply to all column headers like below

您可以设置样式以应用于所有列标题,如下所示

<GridView>
  <GridView.ColumnHeaderContainerStyle>
      <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
      </Style>
   </GridView.ColumnHeaderContainerStyle>
</GridView>

and You can override the header style for a specific column like below:

并且您可以覆盖特定列的标题样式,如下所示:

<GridViewColumn Header="Something">
   <GridViewColumn.HeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="HorizontalContentAlignment" Value="Left" />
    </Style>
   </GridViewColumn.HeaderContainerStyle>
</GridViewColumn>