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