以编程方式设置DataGrid行高属性

时间:2012-01-28 09:52:29

标签: c# wpf datagrid

我有一个关于.NET 4.0中标准WPF DataGrid的问题。

当我尝试使用简单代码设置DataGrid网格行高度时:

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

一切顺利,直到我尝试使用excel /中的鼠标在用户界面/标准方式上调整网格行 - 然后显示网格行无法调整大小。它只是保持120.它的内容按所有方式搞砸......

像Sinead O'Connor会说的那样:告诉我宝贝 - 我哪里出错了?

1 个答案:

答案 0 :(得分:4)

你不是要设置行本身的高度,因为它通过标题等来调整大小。有一个属性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;
}