在WPF数据网格中查找行的高度

wgeznvg7  于 11个月前  发布在  其他
关注(0)|答案(6)|浏览(134)

有人能告诉我如何做到这一点吗?
我已经尝试

dtgMain.RowHeight;

字符串
但它总是返回NAN。

v440hwme

v440hwme1#

使用VisualTreeHelper从数据网格获取DataGridRow。然后使用DataGridRow的ActualHeight属性。

public static T GetFirstVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = GetFirstVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }

    return null;
}

字符串
然后:

DataGridRow row = GetFirstVisualChild<DataGridRow>(dtgMain);
if(row != null)
{
    row.ActualHeight;
}

dphi5xsq

dphi5xsq2#

如果有人需要VB.NET版本的话...

Public Shared Function GetFirstVisualChild(Of T As DependencyObject)(depObj As DependencyObject) As T
    If (depObj IsNot Nothing) Then
        Dim i As Integer
        For i = 0 To VisualTreeHelper.GetChildrenCount(depObj) - 1

            Dim child As DependencyObject = VisualTreeHelper.GetChild(depObj, i)
            If (child IsNot Nothing AndAlso TypeOf child Is T) Then

                Return CType(child, T)
            End If

            Dim childItem As T = GetFirstVisualChild(Of T)(child)
            If (childItem IsNot Nothing) Then Return childItem
        Next
    End If
    Return Nothing
End Function

字符串
然后

Dim row As DataGridRow = CType(GetFirstVisualChild(Of DataGridRow)(grid), DataGridRow)

kuarbcqp

kuarbcqp3#

这很可能是因为网格还没有被渲染。在尝试获取行高之前,请查看测量和排列函数来渲染网格。

ef1yzkbh

ef1yzkbh4#

它是NaN,因为你没有定义它。如果你没有手动设置它,它由行内容的度量结果定义。

xfyts7mz

xfyts7mz5#

必须显示行。挑战是获取DataGridRow的有效示例,以便访问属性ActualHeight。如果在启动时执行此操作,则可以像下面这样默认为0。在发布的代码中,我获取行的高度,假设它们都具有相同的高度以获得显示的行数的指示(我取80%以获得近似值):

int currentRow = _grid.SelectedIndex == -1 ? 0 : _grid.SelectedIndex;
            System.Windows.DependencyObject  dep = _grid.ItemContainerGenerator.ContainerFromIndex(currentRow);
            var dataGridRow = dep as  DataGridRow;
            if (dataGridRow is null)
            {
                string msg = $"Cannot acces row[{currentRow}] of datagrid";
                _log.Error(msg);
                throw new AccessViolationException(msg);
            }
            int visibleRowCount = (int)(_grid.ActualHeight / dataGridRow.ActualHeight * 0.8);

字符串

ygya80vv

ygya80vv6#

下面是作为扩展方法的函数。

public static T GetFirstVisualChild<T>(this DependencyObject depObj) where T : DependencyObject
{
    if (depObj == null) return null;

    for (var i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);
        if (child is T tChild)
        {
            return tChild;
        }

        var childItem = GetFirstVisualChild<T>(child);
        if (childItem != null) return childItem;
    }

    return null;
}

字符串
除非你显式指定DataGridRowHeight,否则它将被设置为double.NaN。如果你想设置高度,最简单的方法是使用DataGridItemContainerStyle属性:

<DataGrid.ItemContainerStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Height" Value="30" />
    </Style>
</DataGrid.ItemContainerStyle>


如果你不想显式设置Height,那么你会想使用ActualHeight属性。区别是Height是行的允许高度,而ActualHeight是渲染高度。

var row = grid.GetFirstVisualChild<DataGridRow>();

MessageBox.Show($"{row.ActualHeight}");

相关问题