麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:32:28
字體:
來源:轉載
供稿:網友

在前端 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,我們以非常靈活的方式實現了本文所提出的需求。

 源碼下載

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: h视频在线播放 | 天天操天天骑 | 国产毛片在线 | 亚洲精品久久久久久 | 久久羞羞| 91久久91久久精品免观看 | 国产成人综合在线观看 | 精品国产一区二区三区蜜殿 | 精品亚洲va在线va天堂资源站 | 91精品国产一区二区三区动漫 | 久久美女免费视频 | 欧美视频在线一区二区三区 | 91精品国产综合久久久动漫日韩 | 毛片免费视频 | 日本看片一区二区三区高清 | 一区二区三区在线视频观看58 | 久草成人在线 | 午夜在线小视频 | 精品国产一区二区三区蜜殿 | 中国毛片在线观看 | 毛片在哪里看 | 国产毛片aaa一区二区三区视频 | 国产精品亚洲激情 | 亚洲最新黄色网址 | 欧美淫交| 国产69精品久久久久9999不卡免费 | 久久精品成人 | 在线高清中文字幕 | 久久久久久久久久久一区 | 日本中文字幕电影在线观看 | 亚洲黑人在线观看 | 久久新地址 | 一级在线观看视频 | 国产黄色毛片 | 国产91精品欧美 | 亚洲第一成网站 | 国产品久久 | 国产精品久久久久久婷婷天堂 | 激情久久精品 | 欧美激情猛片xxxⅹ大3 | 久久精品国产清自在天天线 |