Установка свойства высоты строки DataGrid программно - PullRequest
4 голосов
/ 28 января 2012

У меня есть один вопрос относительно стандартной WPF DataGrid в .NET 4.0.

Когда я пытаюсь программно установить высоту строки сетки DataGrid, используя простой код:

private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Height = 120;            
}

все идет хорошо, пока я не попытаюсь изменить размер строки сетки на пользовательском интерфейсе / стандартным способом сбоку с помощью мыши, как в Excel / - тогда кажется, что размер строки сетки изменить нельзя. Это просто продолжает быть 120. Его содержание, между прочим, все испорчено ...

Как Шинид О'Коннор сказал бы: скажите мне, детка - где я ошибся?

Ответы [ 2 ]

5 голосов
/ 28 января 2012

Вы не должны устанавливать высоту самой строки, так как она изменяется с помощью заголовка и тому подобного.Существует свойство DataGrid.RowHeight, которое позволяет вам сделать это правильно.

Если вам нужно выбрать высоту выборочно, вы можете создать стиль и привязать высоту DataGridCellsPresenter к какому-либо свойству на вашемэлементы:

<DataGrid.Resources>
    <Style TargetType="DataGridCellsPresenter">
        <Setter Property="Height" Value="{Binding RowHeight}" />
    </Style>
</DataGrid.Resources>

Или вы можете получить докладчика из визуального дерева (я рекомендую не рекомендовать это) и назначить высоту там:

// In LoadingRow the presenter will not be there yet.
e.Row.Loaded += (s, _) =>
    {
        var cellsPresenter = e.Row.FindChildOfType<DataGridCellsPresenter>();
        cellsPresenter.Height = 120;
    };

ГдеFindChildOfType - это метод расширения, который можно определить так:

public static T FindChildOfType<T>(this DependencyObject dpo) where T : DependencyObject
{
    int cCount = VisualTreeHelper.GetChildrenCount(dpo);
    for (int i = 0; i < cCount; i++)
    {
        var child = VisualTreeHelper.GetChild(dpo, i);
        if (child.GetType() == typeof(T))
        {
            return child as T;
        }
        else
        {
            var subChild = child.FindChildOfType<T>();
            if (subChild != null) return subChild;
        }
    }
    return null;
}
2 голосов
/ 28 ноября 2017

Это работает для меня.

private void SetRowHeight(double height)
{
    Style style = new Style();
    style.Setters.Add(new Setter(property: FrameworkElement.HeightProperty, value: height));
    this.RowStyle = style;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...