2015-12-10 3 views
3

Невозможно прокручивать данные в DataGrid с помощью клавиш со стрелками. ScrollViewer_KeyDown событие работает нормально при использовании с Grid, но не получает вызов при использовании с datagrid по умолчанию ScrollViewer.DataGrid ScrollViewer не работает

<DataGrid.Resources> 
    <Style TargetType="ScrollViewer"> 
      <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>     
      <EventSetter Event="KeyDown" Handler="ScrollViewer_KeyDown"></EventSetter> 
    </Style> 
</DataGrid.Resources>  

Код

private void ScrollViewer_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Handled) return; 
    var temporaryEventArgs = 
      new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, e.Key) 
    { 
     RoutedEvent = e.RoutedEvent 
    }; 
    // This line avoids it from resulting in a stackoverflowexception 
    if (sender is ScrollViewer) return; 
    ((ScrollViewer)sender).RaiseEvent(temporaryEventArgs); 
    e.Handled = temporaryEventArgs.Handled; 
} 
+0

Используйте событие 'PreviewKeyDown'. Я считаю, что DataGrid обрабатывает событие KeyDown для изменения выбора строк (если была нажата стрелка вверх/вниз). – Domysee

+0

Спасибо, но не работает. –

+1

Выполнен ли ваш обработчик? Вы пытались установить в нем точку останова? – Domysee

ответ

0

Это работает:

<Grid FocusManager.FocusedElement="{Binding ElementName=MyScrollViewer}"> 
    <ScrollViewer x:Name="MyScrollViewer" VerticalScrollBarVisibility="Auto">    
     <DataGrid ItemsSource="{Binding MyCollection}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
     </DataGrid> 
    </ScrollViewer> 
</Grid> 

Нет необходимости обрабатывать любые события. Ключ должен удостовериться, что scrollviewer имеет фокус, установив FocusManager.FocusedElement.

+0

На самом деле я хочу показать полосу прокрутки внутри DataGrid. то, как вы предложили, работает нормально, однако его показ полосы прокрутки за пределами DataGrid –

+0

Вы можете использовать DataGrid ScrollViewer (то, как вы его первоначально использовали), а затем убедитесь, что у DataGrid есть фокус. Единственное предостережение в том, что тогда строка становится фокусом, а стрелка вниз - вниз. –

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