UWP获取Datagrid的ScrollViewer的垂直偏移量
UWP get the vertical offset of Datagrid's ScrollViewer
我正在使用来自“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;
}
正如 Oleg Mikhailov 提到的 source code,它不是用 ScrollViewer
实现的,我们已经用你的代码测试过,我们无法获取 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.
}
我正在使用来自“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;
}
正如 Oleg Mikhailov 提到的 source code,它不是用 ScrollViewer
实现的,我们已经用你的代码测试过,我们无法获取 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.
}