彩票走势图

ScorllViewer随Tab键自动跟随子控件的Focus滚动

转帖|其它|编辑:郝浩|2011-10-19 13:19:51.000|阅读 587 次

概述:当ScrollViewer里包含很多子控件时,默认情况下只能用鼠标手动拖动(或滚轮)滚动条以实现内容的滚动,假如用户是键盘高手,习惯于用Tab键来切换子控件焦点时,即使当前获得焦点的控件在不可见区域,滚动条也不会自动跟随着滚动到相应位置,这个非常不方便,今天在网上看到一个老外的解决办法,代码转贴于此。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  当ScrollViewer里包含很多子控件时,默认情况下只能用鼠标手动拖动(或滚轮)滚动条以实现内容的滚动,假如用户是键盘高手,习惯于用Tab键来切换子控件焦点时,即使当前获得焦点的控件在不可见区域,滚动条也不会自动跟随着滚动到相应位置,这个非常不方便,今天在网上看到一个老外的解决办法,代码转贴于此:

01 private void _ScrollViewer_GotFocus(object sender, RoutedEventArgs e)

02 {

03 FrameworkElement element = e.OriginalSource as FrameworkElement;

04

05 if (element != null)

06 {

07 ScrollViewer scrollViewer = sender as ScrollViewer;

08 scrollViewer.ScrollToVerticalOffset(GetVerticalOffset(element, scrollViewer));

09 }

10

11 }

12

13 private double GetVerticalOffset(FrameworkElement child, ScrollViewer scrollViewer)

14 {

15 // Ensure the control is scrolled into view in the ScrollViewer.

16 GeneralTransform focusedVisualTransform = child.TransformToVisual(scrollViewer);

17 Point topLeft = focusedVisualTransform.Transform(new Point(child.Margin.Left, child.Margin.Top));

18 Rect rectangle = new Rect(topLeft, child.RenderSize);

19 double newOffset = scrollViewer.VerticalOffset + (rectangle.Bottom - scrollViewer.ViewportHeight);

20 return newOffset < 0 ? 0 : newOffset; // no use returning negative offset

21 }

  即:给ScrollViewer的GotFocus事件增加_ScrollViewer_GotFocus处理方法,然后计算当前获取焦点的控件与ScorllViewer的偏移距离,最终得出滚动条应该滚动的偏移量。

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP