我有一个滚动查看器,其中包含一个网格,其中包含一堆表单控件(文本框,复选框,组合框等)。当我浏览控件时,滚动查看器将滚动,但仅在必要时滚动。我的意思是我选中滚动查看器中的所有内容,并且只有当控件不可见时,滚动查看器才会滚动。我想要实现的是当控件位于可见区域的底部25%时滚动查看器向下滚动,然后当控件位于可见区域的前25%(反向标签)时向上滚动。这可以实现吗?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
我认为您应该编写一个实现IScrollInfo接口的自定义控件,并自定义接口提供的值的计算。
看看这个:http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.iscrollinfo.aspx