【问题标题】:UWP get the vertical offset of Datagrid's ScrollViewerUWP获取Datagrid的ScrollViewer的垂直偏移量
【发布时间】:2021-05-17 05:13:16
【问题描述】:

我正在使用“Microsoft.Toolkit.Uwp.UI.Controls”中的数据网格,并且我正在尝试获取内置的 scrollViewer 以便能够在全部滚动时获得垂直偏移并实现某些行为通往底部或中间的道路。到目前为止,我已经尝试了许多在其他不同线程中找到的方法,例如下面的方法,它们扫描可视化树并获取 scrollViewer。但是从此方法返回的 scrollViewer 的 verticalOffset 属性的值始终为零,并且像 ViewChanged 这样的事件永远不会被触发,我尝试调用 updateLayout 方法但它没有改变。

我还尝试将数据网格包装在滚动查看器中并改用它。虽然效果很好,但由于虚拟化,它导致了巨大的性能问题。那么有什么解决办法吗?

private ScrollViewer GetScrollViewer(UIElement element)
        {
            if (element == null) return null;

            ScrollViewer retour = null;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element) && retour == null; i++)
            {
                if (VisualTreeHelper.GetChild(element, i) is ScrollViewer)
                {
                    retour = (ScrollViewer)(VisualTreeHelper.GetChild(element, i));
                }
                else
                {
                    retour = GetScrollViewer(VisualTreeHelper.GetChild(element, i) as UIElement);
                }
            }
            return retour;
        }

【问题讨论】:

  • 你能用上面的代码得到scrollView实例吗?
  • @NicoZhu-MSFT 是的,我可以,但只有当数据网格中有项目时,否则它返回 null,我得到的实例是无用的。无论我做什么,它的垂直偏移始终为 0,并且它的事件不会触发,就像它没有连接到我的数据网格或其他东西一样。
  • @OlegMikhailov 谢谢,这为我指明了正确的方向。

标签: c# xaml uwp uwp-xaml


【解决方案1】:

正如 Oleg Mikhailov 提到的source code,它不是用ScrollViewer 实现的,我们已经用你的代码进行了测试,我们无法获取滚动查看器实例。对于这种情况,您可以通过检测垂直滚动条的值变化事件来获取垂直偏移量,请参考以下代码。

var scrollbar = MyFindDataGridChildOfType<ScrollBar>(MyDataGrid);
scrollbar.ValueChanged += Scroll_ValueChanged;
private void Scroll_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
    Debug.WriteLine(e.NewValue);
   // here is vertical value.
}

【讨论】:

  • 非常感谢,这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多