2012-01-25 3 views
1

Может кто-нибудь, пожалуйста, посоветуйте мне, как это сделать?Поиск высоты строки в WPF datagrid

Я попытался

dtgMain.RowHeight; 

, но это всегда возвращает NaN.

+0

возвращает NaN его еще потому (ваши строки всегда считаются содержимым). set оно вернет значение. –

+0

В любом случае, я могу найти, что такое предполагаемая высота строки? – user589195

+0

это просто NaN. В элементах WPF разрешено иметь NaN как Height, это просто означает, что размер продиктован содержимым, а не явно указывается. Вы можете попытаться вызвать Measure (double.PositiveInfinity, double.PositiveInfinity) и последовать за DesiredSize. однако, это не гарантируется. –

ответ

1

Это, скорее всего, из-за того, что сетка еще не была отображена. Check Out The Measure & Упорядочить функции для рендеринга сетки, прежде чем пытаться получить RowHeigth.

+0

Я действительно думал, что это может быть проблемой, и попытался аннулировать сетку, чтобы заставить ее визуализировать. Вы могли бы написать небольшой пример кода, пожалуйста? – user589195

1

Это NaN, потому что вы не определили его. Если вы не установите его вручную, это определяется результатом измерения содержимого строки.

+0

Не могли бы вы немного расширить ответ? – user589195

2

Получить DataGridRow с помощью VisualTreeHelper из сетки данных. Затем используйте свойство ActualHeight в DataGridRow.

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; 
} 
+0

Попытка сделать это, но получить ошибку Аргументы типа для метода 'OpenStackupGui.MainWindow.GetFirstVisualChild (System.Windows.DependencyObject)' не могут быть выведены из использования. Попробуйте явно указать аргументы типа. – user589195

+0

Вы указали тип при вызове GetFirstVisualChild (dtgMain); – Amit

+0

Ошибка в этой строке в методе GetFirstVisualChild. - T childItem = GetFirstVisualChild (дочерний элемент); – user589195

0

В случае, если кто нуждается в версии 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) 
Смежные вопросы