最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF實現(xiàn)ScrollViewer滾動到指定控件處

 更新時間:2017年06月22日 13:46:43   作者:WPInfo  
這篇文章主要為大家詳細介紹了WPF實現(xiàn)ScrollViewer滾動到指定控件處,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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

// 獲取要定位之前 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 代碼文件中添加上述代碼。

新創(chuàng)建的名為 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,并沒有繼續(xù)向上找
 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,我們以非常靈活的方式實現(xiàn)了本文所提出的需求。

 源碼下載

 以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • .NET?CPU爆高事故事故分析某供應鏈WEB網(wǎng)站

    .NET?CPU爆高事故事故分析某供應鏈WEB網(wǎng)站

    這篇文章主要為大家介紹了.NET?CPU爆高事故事故分析某供應鏈WEB網(wǎng)站,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Asp.net FCKEditor 2.6.3 上傳文件沒有權限解決方法

    Asp.net FCKEditor 2.6.3 上傳文件沒有權限解決方法

    到Fckeditor官方網(wǎng)站下載FredCK.FCKeditorV2.vs2005 (asp.net)
    2009-02-02
  • 用WPF實現(xiàn)屏幕文字提示的實現(xiàn)方法

    用WPF實現(xiàn)屏幕文字提示的實現(xiàn)方法

    本文介紹WPF應用程序實現(xiàn)在屏幕上顯示一行或多行文字通知。它沒有標題欄和最大化最小化等按鈕,可以有半透明背景以使文字的顯示更清晰,鼠標點擊后提示消失。
    2013-07-07
  • asp.net(c#)下各種進制間的輕松轉換(2進制、8進制、10進制、16進制)

    asp.net(c#)下各種進制間的輕松轉換(2進制、8進制、10進制、16進制)

    在.NET Framework中,System.Convert類中提供了較為全面的各種類型、數(shù)值之間的轉換功能。
    2010-10-10
  • asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù)

    asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù)

    今天小編就為大家分享一篇關于asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • vs2010顯示代碼行數(shù)的方法

    vs2010顯示代碼行數(shù)的方法

    這篇文章主要為大家詳細介紹了如何在vs2010中顯示代碼的行數(shù),僅要三步實現(xiàn)代碼行數(shù)顯示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 淺談ASP.NET MVC應用程序的安全性

    淺談ASP.NET MVC應用程序的安全性

    web應用程序的安全性算是一個老生常談的問題了,當然asp.net mvc也不例外,雖然他在設計之初就對此有了一些防范,但是還是要差很多,有很多地方需要我們程序猿們注意的地方,我們今天就來簡單的探討下
    2014-11-11
  • 詳解ASP.NET頁面生命周期

    詳解ASP.NET頁面生命周期

    這篇文章主要為大家介紹了ASP.NET頁面生命周期,熟悉頁面生命周期非常重要,這樣我們才能在生命周期的合適階段編寫代碼,需要的朋友可以參考下
    2015-12-12
  • ASP.NET使用ajax實現(xiàn)分頁局部刷新頁面功能

    ASP.NET使用ajax實現(xiàn)分頁局部刷新頁面功能

    使用ajax方法實現(xiàn)分頁也很簡單,主要是兩個,ContentTemplate和Trigger。先把listView扔ContentTemplate里面。然后在Trigger里面加入asp:AsyncPostBackTrigger,將ID指向之前的分頁控件DataPager控件。具體實現(xiàn)代碼大家可以參考下本文
    2017-03-03
  • C# 事件的設計與使用深入理解

    C# 事件的設計與使用深入理解

    事件是用于通知其他對象發(fā)生了本對象發(fā)生了特定的事情的類型成員;事件是.NET類型成員中相對較為難以理解和實踐的一個成員,因為事件的定義不是繼承自基礎的數(shù)據(jù)類型,而是對委托(delegate)的封裝。所以,在了解事件之前,你需要先了解一點委托
    2012-12-12

最新評論

衢州市| 左权县| 兖州市| 南城县| 新闻| 普安县| 同心县| 德格县| 曲松县| 侯马市| 儋州市| 中江县| 洪湖市| 故城县| 黄龙县| 昌乐县| 聂拉木县| 平果县| 镇江市| 遂溪县| 瑞丽市| 乃东县| 张家界市| 阿拉尔市| 石景山区| 电白县| 五大连池市| 榆社县| 邓州市| 昆明市| 大宁县| 新竹县| 曲阜市| 齐河县| 德惠市| 东方市| 河池市| 佛坪县| 马公市| 广南县| 东源县|