【问题标题】:WPF: Setting the text alignment of a GridViewColumnWPF:设置 GridViewColumn 的文本对齐方式
【发布时间】:2010-07-09 15:46:45
【问题描述】:

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

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

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

如何使文本左对齐?

【问题讨论】:

    标签: wpf xaml listview


    【解决方案1】:

    HeaderContainerStyle 设置为将HorizontalContentAlignment 设置为左​​侧的样式:

    <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>
    

    【讨论】:

      【解决方案2】:

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

          #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
      

      【讨论】:

      • 这很好,谢谢。但是我添加了style.BasedOn = Application.Current.TryFindResource(typeof(GridViewColumnHeader)) as Style; 以增强我现有的样式而不替换它。
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 2011-06-20
        • 2017-09-08
        • 1970-01-01
        相关资源
        最近更新 更多