我有一个包含在它一堆表单控件(文本框,复选框,组合框等)的格子的ScrollViewer中。 当我通过控制选项卡中,ScrollViewer中会滚动,但只在必要时。 我的意思是我通过TAB键在ScrollViewer中的所有内容,并只有当控制是不可见的做的ScrollViewer滚动。 我想做到的是具有ScrollViewer中向下滚动时,控制在可见光区域的底部25%,随后当控制在可见光区域的顶部25%的向上滚动(反向Tab键)。 这能实现呢?
Answer 1:
我发现这个问题的最好的解决办法是办理表单控件GotFocus事件。 由于我产生一个公共区域的控制,很容易这个分配给创建的所有控件。 在本事件处理程序中,我找到元件的其含有网格内的位置。 然后我做了滚动查看器ScrollToVerticalOffset,计算ScrollViewer中的呈现高度的一半的减法。 这使得在ScrollViewer中如果可能的话中间的主动控制。
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);
}
Answer 2:
我想你应该写一个实现IScrollInfo接口的自定义控制,并通过接口提供定制值的计算。
看看这个: http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.iscrollinfo.aspx
文章来源: Setting when to scroll in WPF ScrollViewer