Как автоматически прокрутить сетку данных на один шаг каждые x мс, не блокируя графический интерфейс? - PullRequest
0 голосов
/ 24 октября 2019

То, чего я хочу достичь, это довольно стандартная вещь, я думаю: при перетаскивании строки из 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 мс, пока мышь находится на краю, это заблокирует мой графический интерфейс.

Я не совсем уверен, как это решить. Запуск нового потока невозможен, так как я не думаю, что он будет иметь доступ к элементам управления графическим интерфейсом (также кажется нелогичным запускать поток для простой операции прокрутки.)

...