国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

WPF實現ScrollViewer滾動到指定控件處

來源:懂視網 責編:小采 時間:2020-11-27 22:35:33
文檔

WPF實現ScrollViewer滾動到指定控件處

WPF實現ScrollViewer滾動到指定控件處:在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作后能夠定位到其中指定的控件處;這很像在 HTML 頁面中點擊一個鏈接后定位到當前網頁上的某個 anchor。 要實現它,首先我們需要看 Scrol
推薦度:
導讀WPF實現ScrollViewer滾動到指定控件處:在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作后能夠定位到其中指定的控件處;這很像在 HTML 頁面中點擊一個鏈接后定位到當前網頁上的某個 anchor。 要實現它,首先我們需要看 Scrol

在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作后能夠定位到其中指定的控件處;這很像在 HTML 頁面中點擊一個鏈接后定位到當前網頁上的某個 anchor。

要實現它,首先我們需要看 ScrollViewer 為我們提供的 API,其中并沒有類似于 ScrollToControl 這樣的方法;在它的幾個以 ScrollTo 開頭的方法中,最合適的就是 ScrollToVerticalOffset 這個方法了,這個方法接受一個參數,即縱向的偏移位置。那么,很重要的問題:我們怎么能得到要定位的那個控件在 ScrollViewer 中的位置呢?

在我之前寫的這篇文章中:XAML: 獲取元素的位置,有如何獲到元素相對位置的介紹,建議大家先了解一下,其中使用了 Visual.TransformToVisual 方法等。當你理解了這篇文章后,再回過頭來看本文后面的內容,就很容易了。

接下來,我們使用以下代碼,即可實現上述需求:

// 獲取要定位之前 ScrollViewer 目前的滾動位置
 var currentScrollPosition = ScrollViewer.VerticalOffset;
 var point = new Point(0, currentScrollPosition);

 // 計算出目標位置并滾動
 var targetPosition = TargetControl.TransformToVisual(ScrollViewer).Transform(point);
 ScrollViewer.ScrollToVerticalOffset(targetPosition.Y);

另外,由于通常情況下,我們會采用 MVVM 模式,因此我們可以將上述代碼封裝成一個 Action,而避免在 Code-Behind 代碼文件中添加上述代碼。

新創建的名為 ScrollToControlAction 的 Action,在其中定義兩個依賴屬性 ScrollViewer 和 TargetControl,分別表示指定的要操作的 ScrollViewer 和要定位到的控件,然后將上述代碼放到其 Invoke 方法中即可。由于 Action 并非本文主題,所以這里并不會展開太多的講解,可以參考以下代碼或本文后提供的 Demo 作進一步了解。

namespace ScrollTest
{
 /// <summary>
 /// 在 ScrollViewer 中定位到指定的控件
 /// 說明:目前支持的是垂直滾動
 /// </summary>
 public class ScrollToControlAction : TriggerAction<FrameworkElement>
 {
 public static readonly DependencyProperty ScrollViewerProperty =
 DependencyProperty.Register("ScrollViewer", typeof(ScrollViewer), typeof(ScrollToControlAction), new PropertyMetadata(null));

 public static readonly DependencyProperty TargetControlProperty =
 DependencyProperty.Register("TargetControl", typeof(FrameworkElement), typeof(ScrollToControlAction), new PropertyMetadata(null));

 /// <summary>
 /// 目標 ScrollViewer
 /// </summary>
 public ScrollViewer ScrollViewer
 {
 get { return (ScrollViewer)GetValue(ScrollViewerProperty); }
 set { SetValue(ScrollViewerProperty, value); }
 }

 /// <summary>
 /// 要定位的到的控件
 /// </summary>
 public FrameworkElement TargetControl
 {
 get { return (FrameworkElement)GetValue(TargetControlProperty); }
 set { SetValue(TargetControlProperty, value); }
 }

 protected override void Invoke(object parameter)
 {
 if (TargetControl == null || ScrollViewer == null)
 {
 throw new ArgumentNullException($"{ScrollViewer} or {TargetControl} cannot be null");
 }

 // 檢查指定的控件是否在指定的 ScrollViewer 中
 // TODO: 這里只是指定離它最近的 ScrollViewer,并沒有繼續向上找
 var container = TargetControl.FindParent<ScrollViewer>();
 if (container == null || container != ScrollViewer)
 {
 throw new Exception("The TargetControl is not in the target ScrollViewer");
 }

 // 獲取要定位之前 ScrollViewer 目前的滾動位置
 var currentScrollPosition = ScrollViewer.VerticalOffset;
 var point = new Point(0, currentScrollPosition);

 // 計算出目標位置并滾動
 var targetPosition = TargetControl.TransformToVisual(ScrollViewer).Transform(point);
 ScrollViewer.ScrollToVerticalOffset(targetPosition.Y);
 }
 }
}

其使用方法如下:

<Button>
 <i:Interaction.Triggers>
 <i:EventTrigger EventName="Click">
 <local:ScrollToControlAction ScrollViewer="{Binding ElementName=s}" TargetControl="{Binding ElementName=txtSectionC}" />
 </i:EventTrigger>
 </i:Interaction.Triggers>
</Button>

至此,結合 Action,我們以非常靈活的方式實現了本文所提出的需求。

 源碼下載

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

WPF實現ScrollViewer滾動到指定控件處

WPF實現ScrollViewer滾動到指定控件處:在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作后能夠定位到其中指定的控件處;這很像在 HTML 頁面中點擊一個鏈接后定位到當前網頁上的某個 anchor。 要實現它,首先我們需要看 Scrol
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产在线欧美日韩精品一区二区 | 亚洲综合视频 | 久久性色| 国内一级片 | 精品123区| 欧美成人猛男性色生活 | 亚洲 欧美 国产另类首页 | 国产精品三级一区二区 | 国产成人精品一区二三区在线观看 | 国内精品伊人久久久久妇 | 欧洲毛片 | 国产美女精品久久久久中文 | 欧美一区二区在线视频 | 劲爆欧美第一页 | 美女视频黄全免费的 | 亚洲欧美另类专区 | 久久一 | 国产精品一区久久 | 亚洲小视频在线 | 青青国产成人久久91 | 国产午夜视频在线 | 国产在线每日更新 | 亚洲高清在线观看视频 | 日本三级全黄三级a | 国产精品久久久久999 | 欧美日本一区 | 欧美首页| 国产免费一区二区三区 | 影音先锋亚洲资源 | 一级毛片一级毛片一级级毛片 | 国产欧美一区二区三区在线 | 精品一区二区三区的国产在线观看 | 在线播放一区二区三区 | 精品视频在线观看视频免费视频 | 欧美日韩视频一区二区三区 | 人与禽一级一级毛片 | 国产精品一区二区三区四区五区 | 亚洲精品一二三 | 国产高清视频 | 韩日精品视频 | 日韩欧美电影在线观看 |