GridViewColumn Регулировка ширины - PullRequest
5 голосов
/ 31 января 2012

Мой интерфейс:

<ListView Name="persons" SelectionChanged="persons_SelectionChanged">
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="auto"/>
                <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="auto"/>
            </GridView>
        </ListView.View>
    </ListView>

Код моего интерфейса:

internal void Update(IEnumerable<Person> pers)
    {
        this.persons.ItemsSource = null;
        this.persons.ItemsSource = pers;
        UpdateLayout();
    }

Мои сущности:

class Person
{
   public string Name { get; set; }
   public int Age { get; set; }
}

GridViewColumns имеет ширину GridViewColumn-Header. Даже если я позвоню Update () с людьми с длинным именем. Размер столбца не изменяется.

a) Как я могу изменить размер столбца «Имя» автоматически (когда я вызвал «Обновление») до длины самого длинного имени, но не длиннее значения х (я хочу указать максимальную ширину столбца)?

б) Как я могу указать, что столбец "Возраст" заполняет пространство до конца элемента управления (чтобы столбцы таблицы сетки использовали полную ширину элемента управления)?

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

GridView не изменяет размеры автоматически.

Чтобы изменить размеры столбцов, вы можете

    foreach (GridViewColumn c in gv.Columns)
    {
        // Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector)
        // i.e. it is the same code that is executed when the gripper is double clicked
        // if (adjustAllColumns || App.StaticGabeLib.FieldDefsGrid[colNum].DispGrid)
        if (double.IsNaN(c.Width))
        {
            c.Width = c.ActualWidth;
        }
        c.Width = double.NaN;
     }  

Что касается определения размера последней для заполнения области, я делаю это с помощью конвертера.Я не думаю, что этот конвертер делает именно то, что вам нужно для этого, но он должен начать вас.

    <GridViewColumn Width="{Binding ElementName=lvCurDocFields, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}">


    [ValueConversion(typeof(double), typeof(double))]
    public class WidthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // value is the total width available
            double otherWidth;
            try
            {
                otherWidth = System.Convert.ToDouble(parameter);
            }
            catch
            {
                otherWidth = 100;
            }
            if (otherWidth < 0) otherWidth = 0;

            double width = (double)value - otherWidth;
            if (width < 0) width = 0;
            return width; // columnsCount;

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

GridView работает быстро, но требует немного присмотра за детьми.

1 голос
/ 31 января 2012

Я вытащил это из Как автоматически изменять размер и выравнивать данные GridViewColumn в WPF по правому краю?

<Window.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</Window.Resources>

Это вам вообще поможет?

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