Как выполнить автоматическую прокрутку на сетке данных WPF - PullRequest
33 голосов
/ 22 июня 2009

Я думаю, что я глупый. Сейчас я искал 15 минут и нашел несколько разных решений для прокрутки данных, но ни одно из них мне не помогло.

Я использую WPF с .NET 3.5 и WPF Toolkit DataGrid. Моя сетка обновляется, когда моя наблюдаемая коллекция изменяется, работает отлично. Теперь моя DataGrid находится внутри обычной Grid, и полосы прокрутки появляются, если DataGrid становится слишком большим. Тоже хорошо ...

А теперь приходит вопрос 1.000.000 $:

Как получить сетку данных для прокрутки до последнего ряда? Есть:

  • Нет свойства AutoScroll
  • нет CurrentRowSelected Index
  • CurrentCell, но нет Коллекции, которую я мог бы использовать для CurrentCell = AllCells.Last

Есть идеи? Я чувствую себя действительно глупо, и кажется странным, что этот вопрос такой сложный. Чего мне не хватает?

Ответы [ 15 ]

0 голосов
/ 21 января 2019

Следующий код работает для меня;

Private Sub DataGrid1_LoadingRow(sender As Object, e As DataGridRowEventArgs) Handles DataGrid1.LoadingRow
    DataGrid1.ScrollIntoView(DataGrid1.Items.GetItemAt(DataGrid1.Items.Count - 1))
End Sub
0 голосов
/ 29 августа 2016

Если вы использовали dataview для datagrid.datacontext, вы можете использовать это:

private void dgvRecords_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var dv = dgvRecords.DataContext as DataView;
    if (dv.Count > 0)
    {
        var drv = dv[dv.Count - 1] as DataRowView;
        dgvRecords.ScrollIntoView(drv);
    }
}
0 голосов
/ 29 августа 2015

Автоматическая прокрутка таблицы данных WPF

Автопрокрутка, пока кнопка мыши нажата на кнопке управления.

XAML

<Button x:Name="XBTNPageDown" Height="50" MouseLeftButtonDown="XBTNPageDown_MouseLeftButtonDown"  MouseUp="XBTNPageDown_MouseUp">Page Down</Button>

Код

    private bool pagedown = false;
    private DispatcherTimer pageDownTimer = new DispatcherTimer();

    private void XBTNPageDown_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        pagedown = true;
        pageDownTimer.Interval = new TimeSpan(0, 0, 0, 0, 30);
        pageDownTimer.Start();
        pageDownTimer.Tick += (o, ea) =>
        {
            if (pagedown)
            {
                var sv = XDG.FindVisualChild<ScrollViewer>();
                sv.PageDown();
                pageDownTimer.Start();
            }
            else
            {
                pageDownTimer.Stop();
            }
        };
    }

    private void XBTNPageDown_MouseUp(object sender, MouseButtonEventArgs e)
    {
        pagedown = false;
    }

Это метод расширения

Поместите его в статический класс по вашему выбору и добавьте ссылку на код выше.

   public static T FindVisualChild<T>(this 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 = FindVisualChild<T>(child);
                if (childItem != null) return childItem;
            }
        }
        return null;
    }

ПРИМЕЧАНИЕ. Свойство sv можно переместить, чтобы избежать повторной работы.

У кого-нибудь есть способ RX сделать это?

0 голосов
/ 09 января 2012

Если вы используете шаблон MVVM , вы можете комбинировать эту статью с этой другой: http://www.codeproject.com/KB/WPF/AccessControlsInViewModel.aspx.

Идея состоит в том, чтобы использовать вложенные свойства для доступа к элементу управления в вашем классе ViewModel. После этого вам нужно будет проверить, что сетка данных не равна нулю, и в ней есть какие-либо элементы.

if ((mainDataGrid != null) && (mainDataGrid.Items.Count > 0)){
//Same snippet
}
0 голосов
/ 22 июня 2009

Вам нужно получить ссылку на объект ScrollViewer для вашей DataGrid. Затем вы можете манипулировать свойством VerticalOffset для прокрутки до самого дна.

Чтобы добавить еще больше бликов в ваше приложение ... вы можете добавить анимацию Spline к свитку, чтобы все выглядело на одном уровне с остальной частью приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...