轉帖|其它|編輯:郝浩|2011-10-19 13:19:51.000|閱讀 609 次
概述:當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@fc6vip.cn
文章轉載自:博客園