То, чего я хочу достичь, это довольно стандартная вещь, я думаю: при перетаскивании строки из DataGrid в WPF, если курсор мыши достигает верхнего или нижнего края, DataGrid должен автоматически прокручивать больше контента в поле зрения.
Следующее, однако, немного запутано из-за устаревшего кода, который обрабатывает функцию перетаскивания. Пока что я запускаю операцию прокрутки из события MouseMove
DataGrid:
private void DataGrid_MouseMove(object sender, MouseEventArgs e)
{
...
var mouseposition = e.GetPosition(m_DataGrid);
if (mouseposition.Y < 50)
{
dispatcher.Invoke(() => DatagridAutomaticScroll(m_DataGrid, false), DispatcherPriority.Normal);
}
else if (mouseposition.Y > (m_DataGrid.Height - 50))
{
dispatcher.Invoke(() => DatagridAutomaticScroll(m_DataGrid, true), DispatcherPriority.Normal);
}
else
{
scrollwatch.Reset();
}
}
И это вызванный метод:
private void DatagridAutomaticScroll(DataGrid dataGrid, bool scrolldown)
{
if (scrollwatch.IsRunning && scrollwatch.ElapsedMilliseconds < 500) return;
ScrollViewer scroller = GetScrollViewer(dataGrid);
if (scrolldown)
{
// will be implemented later
}
else
{
if (scroller.VerticalOffset == 0) return;
scroller.ScrollToVerticalOffset(scroller.VerticalOffset - 1);
scrollwatch.Restart();
}
}
Таймер секундомера не позволяет скроллеру прокручивать всеСразу же, однако есть две проблемы с этим:
- Как это реализовано сейчас, просмотрщик прокрутки будет только прокручивать, пока пользователь перемещает мышь (так как все это вызывается только из
MouseMove
событие). - Если я помещу все в цикл, который прокручивается каждые x мс, пока мышь находится на краю, это заблокирует мой графический интерфейс.
Я не совсем уверен, как это решить. Запуск нового потока невозможен, так как я не думаю, что он будет иметь доступ к элементам управления графическим интерфейсом (также кажется нелогичным запускать поток для простой операции прокрутки.)