WPF - Как центрировать данные столбца в ListView? - PullRequest
2 голосов
/ 01 ноября 2009

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

<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, но некоторые простые вещи вроде этого кажутся очень сложными.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2009

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

0 голосов
/ 07 февраля 2012

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

<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 голосов
/ 01 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...