2015-10-28 3 views
0

У меня есть простой DataGrid с RowDetails. В RowDetails содержится еще один DataGrid. Когда RowDetails сбрасывается, прокрутка работает нормально, как и следовало ожидать. Но когда RowDetails видны, прокрутка останавливается, как только RowDetails получает прокрутку под курсором. Я предполагаю, что происходит, что он пытается прокрутить DataGrid в деталях, но в нем нет полосы прокрутки. Единственный способ прокрутки - перемещать курсор от RowDetails. Но в DataGrid с несколькими RowDetails, все из которых имеют DataGrid с шириной родительского DataGrid, это действительно раздражает.Как предотвратить зависание DataGrid RowDetails от прокрутки?

Также кажется, что это просто, но я ничего не могу с этим поделать. Итак, как мне помешать RowDetails испортить мою прокрутку?

ответ

0

Я нашел решение этого вопроса. Проблема заключается в DateGrid, а не в RowDetails, поэтому это также относится ко всем DataGrids в ScrollViewers.

Первый способ сделать это: IsHitTestVisible - false. Затем DataGrid будет игнорироваться курсором и не будет блокировать прокрутку. Недостатком этого является то, что курсор полностью игнорируется, поэтому вы больше не можете щелкнуть по вещам в DataGrid. Поскольку это, как правило, необходимо, а также для моего случая это не является отличным решением.

Итак, второй и лучший способ - уловить событие прокрутки на внутреннем DataGrid и передать его внешнему DataGrid или тому, что должно прокручиваться. Мы можем сделать это с помощью события PreviewMouseWheel события DataGrid. Тогда можно прокручивать внешнюю ScrollViewer так:

ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ContentVerticalOffset - e.Delta); 

Найдено здесь: DataGrids over ScrollViewer prevent it to scroll

Если внешнее управление является DataGrid мы сначала должны получить его ScrollViewer как это:

private static ScrollViewer GetScrollbar(DependencyObject dep) 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++) 
    { 
     var child = VisualTreeHelper.GetChild(dep, i); 
     if (child != null && child is ScrollViewer) 
      return child as ScrollViewer; 
     else 
     { 
      ScrollViewer sub = GetScrollbar(child); 
      if (sub != null) 
       return sub; 
     } 
    } 
    return null; 
} 

ScrollViewer scrollView = GetScrollbar(myDataGrid); 

код от: http://blog.kervinramen.com/2010/10/wpf-datagrid-controlling-scrollbar.html

Если у внутреннего DataGrid есть контент, который можно прокручивать, нам нужно добавить условие для прохождения по прокрутке ng, вот так:

if (e.Delta > 0 && sv.VerticalOffset == 0 || e.Delta < 0 && 
    ScrollViewer.VerticalOffset == ScrollViewer.ScrollableHeight) 

После этого DataGrid будет вести себя как TextBox. Если курсор окажется над ним, он будет прокручиваться, пока он не достигнет дна. Затем он пройдет прокрутку к внешнему управлению и позволит ему прокручиваться. То же самое для прокрутки.

Также e.Delta всегда будет 120 или -120. Проверьте, как это относится к вашему приложению. Мне пришлось разделить его на 2,5, чтобы получить ту же прокрутку, что и внешний DataGrid.

Смежные вопросы