2009-11-01 4 views
2

Je suis encore en train d'apprendre WPF, mais je suis vraiment confus au sujet de quelque chose qui devrait être vraiment simple. Ce que je veux faire est de centrer le contenu des 3ème et 4ème colonnes. Quand je lance cela, les colonnes sont justifiées à gauche.WPF - Comment centrer les données de colonne dans ListView?

<ListView Margin="0" x:Name="listMonitoredUrls" AlternationCount="1" 
      ItemsSource="{Binding}" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Description" DisplayMemberBinding="{Binding FriendlyDesc}"/> 
      <GridViewColumn Header="Url" DisplayMemberBinding="{Binding Url}"/> 
      <GridViewColumn Header="Frequency"> 
       <GridViewColumn.CellTemplate > 
        <DataTemplate> 
         <TextBlock Text="{Binding ScanFrequencyMinutes}" 
            HorizontalAlignment="Center"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Next Scan" > 
       <GridViewColumn.CellTemplate > 
        <DataTemplate> 
         <TextBlock Text="{Binding TimeNextScanStr}" 
            HorizontalAlignment="Center"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

I "m commence vraiment à aimer WPF, mais certaines choses simples comme celui-ci semblent être vraiment difficile

Répondre

0

Essayez d'utiliser la propriété TextAlignment au lieu de HorizontalAlignment - devrait le faire pour ma compréhension HorizontalAlignment="Center" centrera votre textblock pas le texte dans ce

+0

C'était ce que je dans ma première tentative. Ça ne marche pas non plus. Désolé de ne pas l'avoir mis dans ma publication initiale. –

+0

cela fonctionne-t-il si vous aling gauche ou droit? vérifier ce lien et voir si vous pouvez repérer les différences avec votre xaml -> http://social.msdn.microsoft.com/forums/en-US/wpf/thread/1f17a5a6-c71f-4810-b8bc-e4eb2a25fa96/ – JohnIdol

0

Cela pourrait être un long shot, mais j'ai dû le faire pour listboxes où les éléments sont définis par des modèles Essayez... la définition de HorizontalContentAlignment = "Stretch" sur votre ListView. Je ne définis pas que les objets ne prennent que l'espace dont ils ont besoin et sont justifiés à gauche.

0

J'ai créé une solution qui fonctionne dans le scénario commun:

<GridViewColumn Header="Some Property" DisplayMemberBinding="{Binding SomeProperty}" /> 

où l'on ne veut un DisplayMemberBinding simple avec du texte sans avoir à spécifier un CellTemplate

le nouveau code utilise un joint la propriété et devient:

<GridViewColumn Header="Some Property" DisplayMemberBinding="{Binding SomeProperty}" 
       ctrl:GridViewExtensions.IsContentCentered="True" /> 

code de la propriété ci-joint:

public static class GridViewExtensions 
{ 
    #region IsContentCentered 

    [Category("Common")] 
    [AttachedPropertyBrowsableForType(typeof(GridViewColumn))] 
    public static bool GetIsContentCentered(GridViewColumn gridViewColumn) 
    { 
     return (bool)gridViewColumn.GetValue(IsContentCenteredProperty); 
    } 
    public static void SetIsContentCentered(GridViewColumn gridViewColumn, bool value) 
    { 
     gridViewColumn.SetValue(IsContentCenteredProperty, value); 
    } 

    public static readonly DependencyProperty IsContentCenteredProperty = 
     DependencyProperty.RegisterAttached(
      "IsContentCentered", 
      typeof(bool), // type 
      typeof(GridViewExtensions), // containing type 
      new PropertyMetadata(default(bool), OnIsContentCenteredChanged) 
      ); 

    private static void OnIsContentCenteredChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     OnIsContentCenteredChanged((GridViewColumn)d, (bool)e.NewValue); 
    } 
    private static void OnIsContentCenteredChanged(GridViewColumn gridViewColumn, bool isContentCentered) 
    { 
     if (isContentCentered == false) { return; } 
     // must wait a bit otherwise GridViewColumn.DisplayMemberBinding will not yet be initialized, 
     new DispatcherTimer(TimeSpan.FromMilliseconds(100), DispatcherPriority.Normal, OnColumnLoaded, gridViewColumn.Dispatcher) 
     { 
      Tag = gridViewColumn 
     }.Start(); 
    } 

    static void OnColumnLoaded(object sender, EventArgs e) 
    { 
     var timer = (DispatcherTimer)sender; 
     timer.Stop(); 

     var gridViewColumn = (GridViewColumn)timer.Tag; 
     if (gridViewColumn.DisplayMemberBinding == null) 
     { 
      throw new Exception("Only allowed with DisplayMemberBinding."); 
     } 
     var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock)); 
     textBlockFactory.SetBinding(TextBlock.TextProperty, gridViewColumn.DisplayMemberBinding); 
     textBlockFactory.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Center); 
     var cellTemplate = new DataTemplate { VisualTree = textBlockFactory }; 
     gridViewColumn.DisplayMemberBinding = null; // must null, otherwise CellTemplate won't be recognized 
     gridViewColumn.CellTemplate = cellTemplate; 
    } 

    #endregion IsContentCentered 

}

+0

note que je n'ai pas testé complètement l'intervalle 'DispatcherTimer', donc vous voudrez peut-être jouer avec. –

+0

aussi, notez que ma solution ne prend pas en compte un changement à la valeur. (c'est-à-dire si la valeur 'IsContentCentered' est passée de true à false, la liaison ne retournera pas à l'alignement de gauche) –

Questions connexes