3

我有一个滚动查看器,其中包含一个网格,其中包含一堆表单控件(文本框、复选框、组合框等)。当我浏览控件时,滚动查看器将滚动,但仅在必要时滚动。我的意思是我浏览滚动查看器中的所有内容,只有当控件不可见时滚动查看器才会滚动。我想要完成的是让滚动查看器在控件位于可见区域的底部 25% 时向下滚动,然后在控件位于可见区域的顶部 25% 时向上滚动(反向制表符)。这可以实现吗?

4

2 回答 2

1

我为这个问题找到的最佳解决方案是处理表单控件的 GotFocus 事件。由于我在公共区域中生成控件,因此很容易将其分配给创建的所有控件。在这个事件处理程序中,我定位了元素在其包含网格中的位置。然后我在滚动查看器上执行 ScrollToVerticalOffset,计算减去滚动查看器渲染高度的一半。如果可能,这会将活动控件保持在滚动查看器的中间。

void FormElement_GotFocus(object sender, RoutedEventArgs e)
{
    FormElement element = sender as FormElement;
    Point elementLocation = element.TranslatePoint(new Point(), canvasGrid);
    double finalHeight = elementLocation.Y - (canvasScrollViewer.RenderSize.Height/2);
    canvasScrollViewer.ScrollToVerticalOffset(finalHeight);
}
于 2012-10-01T12:56:50.687 回答
0

我认为您应该编写一个实现 IScrollInfo 接口的自定义控件,并自定义该接口对提供的值的计算。

看看这个:http: //msdn.microsoft.com/en-us/library/system.windows.controls.primitives.iscrollinfo.aspx

于 2012-09-07T15:39:54.633 回答