请问有人能告诉我如何做到这一点吗?
我已经尝试过了。
dtgMain.RowHeight;
但是这总是返回NAN。
请问有人能告诉我如何做到这一点吗?
我已经尝试过了。
dtgMain.RowHeight;
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;
}
如果有人需要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)
这是NaN,因为你没有定义它。如果你不手动设置它,它将由行内容的测量结果定义。
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;
}
DataGridRow
的Height
,否则它将被设置为double.NaN
。如果您想设置高度,最简单的方法是使用DataGrid
的ItemContainerStyle
属性:<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}");
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);