2010-07-09 7 views
7

Standardmäßig ist Text in den Headern einer ListView (nicht in den Inhaltszellen!) Zentriert, ich habe gekämpft, um es linksbündig zu machen, hier ist, was ich ' ve kam mit:WPF: Textausrichtung einer GridViewColumn einstellen

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

Dies scheint der richtige Ort zu sein, um das Aussehen des Headers zu ändern, da ich andere Eigenschaften wie Margin ändern kann, usw., aber es reagiert nicht auf die HorizontalAlignment Eigenschaft! Ich nehme an, dass die Textbox inhaltlich und selbst zentriert ist, wodurch die Ausrichtungseigenschaft überflüssig wird.

Wie kann ich den Text linksbündig machen?

Antwort

19

Stellen Sie den HeaderContainerStyle zu einem Stil, der HorizontalContentAlignment nach links setzt:

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

Hier ist eine angebaute Eigenschaft für den Inhalt Ausrichtung des Kopfeinstellung:

#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 
+0

Dies funktionierte gut, danke. Allerdings habe ich 'style.BasedOn = Application.Current.TryFindResource (typeof (GridViewColumnHeader)) als Style hinzugefügt,' um meinen bestehenden Stil zu erweitern, ohne ihn zu ersetzen. –