2009-11-01 2 views
2

Я все еще изучаю WPF, но я действительно смущен тем, что должно быть очень просто. То, что я хочу сделать, это сосредоточить содержимое 3-го и 4-го столбцов. Когда я запускаю это, столбцы по левому краю:.WPF - Как центрировать данные столбца в 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> 

я "м действительно начинает нравиться WPF, но некоторые простые вещи, как это, кажется, очень трудно

ответ

0

Попробуйте использовать TextAlignment свойство вместо HorizontalAlignment - должно это сделать в моем понимании HorizontalAlignment="Center" будет центрирование TextBlock не текст в нем

+0

Это было то, что я использовал в своей первой попытке. Это тоже не работает. Извините за то, что не поставил это в моей первоначальной публикации. –

+0

Работает ли это, если вы нажмете слева или справа? проверьте эту ссылку и посмотрите, можете ли вы выявить различия с вашим xaml -> http://social.msdn.microsoft.com/forums/en-US/wpf/thread/1f17a5a6-c71f-4810-b8bc-e4eb2a25fa96/ – JohnIdol

0

Это может быть длинным выстрелом, но я должен был сделать это для ListBoxes, где элементы определяются с помощью шаблонов Попробуйте... установка HorizontalContentAlignment = "Stretch" в вашем ListView. Я не устанавливаю, что элементы занимают столько места, сколько им нужно, и остаются в силе.

0

Я создал решение, которое работает под общим сценарием:

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

где один хочет простой DisplayMemberBinding с текстом только без указания CellTemplate

нового кода использует вложенный свойство и становится:

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

прилагается код объекта:

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 что я НЕ тщательно тестировал интервал «DispatcherTimer», поэтому вы можете захотеть с ним столкнуться. –

+0

также обратите внимание, что мое решение НЕ принимает во внимание изменение значения. (то есть, если значение IsContentCentered изменено с true на false, привязка не вернется к выравниванию по левому краю) –

Смежные вопросы