C# WPF DataGrid ScrollIntoView 无法使用触摸

C# WPF DataGrid ScrollIntoView not working with touch

我尝试在 Loaded 事件中滚动到 WPF DataGrid 中最后选择的项目。 DataGrid 位于 Tab 中。当我在正常的 Windows 环境中测试时,一切正常。但是,一旦我 触摸 平板电脑上的 TabPage 而不是 单击 它,它就不会滚动到我上次选择的项目。 到目前为止,这是我的代码:

private void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
    var currentItem = dataGrid.SelectedItem;

    dataGrid.ItemsSource = sh.GetDataTable(<SQL Select statement>).DefaultView;

    if (!(currentItem == null))
    {
        dataGrid.ScrollIntoView(currentItem);
    }
}

我也尝试了我找到的解决方案 但它没有用。

编辑:

出于测试目的,我完全删除了 dataGrid_Loaded 事件。现在我只在程序开始时将数据加载到 DataGrid 中。即使现在,当我使用鼠标 clicks 而不是 touch 在选项卡之间切换时,它仍保持滚动位置!这是 .NET Framework 中的错误吗?

在 MSDN 社区的帮助下,我解决了这个问题。

我必须滚动到 DataGrid 的末尾,执行 UpdateLayout(),然后滚动到我想要的 Item。 此外,我不能每次都设置 ItemsSource,因为我之前保存的 Item 不再是 DataGrid 的有效 Item

最后我的 dataGrid_Loaded 方法如下所示:

private void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
    object currentPos = dataGrid.SelectedItem;

    if (dataGrid.ItemsSource == null)
    {
        dataGrid.ItemsSource = sh.GetDataTable("<SQL query>").DefaultView;
    }
    else
    {
        dataGrid.Items.Refresh();
    }

    if (currentPos != null)
    {
        dataGrid.ScrollIntoView(dataGrid.Items[dataGrid.Items.Count - 1]);
        dataGrid.UpdateLayout();
        dataGrid.ScrollIntoView(currentPos);
    }
}

我希望这对遇到同样问题的其他人有所帮助。

供参考 here 是我的德语 MSDN 线程,我的问题已在其中解决。