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;
}
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)
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);
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;
}
6条答案
按热度按时间v440hwme1#
使用VisualTreeHelper从数据网格获取DataGridRow。然后使用DataGridRow的ActualHeight属性。
字符串
然后:
型
dphi5xsq2#
如果有人需要VB.NET版本的话...
字符串
然后
型
kuarbcqp3#
这很可能是因为网格还没有被渲染。在尝试获取行高之前,请查看测量和排列函数来渲染网格。
ef1yzkbh4#
它是NaN,因为你没有定义它。如果你没有手动设置它,它由行内容的度量结果定义。
xfyts7mz5#
必须显示行。挑战是获取DataGridRow的有效示例,以便访问属性ActualHeight。如果在启动时执行此操作,则可以像下面这样默认为0。在发布的代码中,我获取行的高度,假设它们都具有相同的高度以获得显示的行数的指示(我取80%以获得近似值):
字符串
ygya80vv6#
下面是作为扩展方法的函数。
字符串
除非你显式指定
DataGridRow
的Height
,否则它将被设置为double.NaN
。如果你想设置高度,最简单的方法是使用DataGrid
的ItemContainerStyle
属性:型
如果你不想显式设置
Height
,那么你会想使用ActualHeight
属性。区别是Height
是行的允许高度,而ActualHeight
是渲染高度。型