1. 程式人生 > >WPF ScrollViewer 滾動到指定控制元件處

WPF ScrollViewer 滾動到指定控制元件處

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

相關推薦

WPF ScrollViewer 滾動指定控制元件

在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作後能夠定位到其中指定的控制元件處;這很像在 HTML 頁面中點選一個連結後定位到當前網頁上的某個 anchor。要實現它,首先我們需要看 ScrollViewer 為我們提供的 API

WPF: 實現 ScrollViewer 滾動指定控制元件

在前端 UI 開發中,有時,我們會遇到這樣的需求:在一個 ScrollViewer 中有很多內容,而我們需要實現在執行某個操作後能夠定位到其中指定的控制元件處;這很像在 HTML 頁面中點選一個連結後定位到當前網頁上的某個 anchor。 要實現它,首先我們需要看 ScrollViewer 為我們提供的 A

JQuery控制螢幕滾動指定控制元件位置

<!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/htm

WPF 滾動文字控制元件MarqueeControl

WPF使用的滾動文字控制元件,支援上下左右滾動方式,支援設定滾動速度XAML部分:<UserControl x:Class="UIControl.MarqueeControl" xmlns="http://schemas.microsoft.c

SciChart WPF 炫酷畫圖控制元件使用方法

下載連結:http://download.csdn.net/download/wangxingxing321/10129509 這是一套非常炫酷的畫圖控制元件,有很多的主題可以選擇,適合顯示各種資料,這個軟體包就是幫助使用者使用控制元件的,軟體上有WPF前臺和後臺的程式碼,接下來本文

WindowsXamlHost:在 WPF 中使用 UWP 控制元件庫中的控制元件

原文 WindowsXamlHost:在 WPF 中使用 UWP 控制元件庫中的控制元件 在 WindowsXamlHost:在 WPF 中使用 UWP 的控制元件(Windows Community Toolkit) 一文中,我們說到了在 WPF 中引入簡單的 UWP 控制元件以及相關

WPF中使用瀏覽器控制元件WebBrowser

設定使用IE的版本 public static class Extensions { #region 設定WebBroswer 使用IE版本 public static void SetWebBrowserFeatures(int i

WPF 按名稱查詢控制元件

1FrameworkElement類FindName方法   使用過程 1.容器控制元件.RegisterName("Name",要註冊的控制元件)   //註冊控制元件 2.容器控制元件.FindName("Name") as  控制元件型別 &

WPF網格繫結控制元件控制控制元件是否可讀

<DataGridTemplateColumn Width="100" Header="實測值"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel HorizontalAlignment

WPF 語言格式化文字控制元件

前言 本章講述正確新增語言資源的方式,以及一段語言資源的多種樣式顯示。 例如:“@Winter,你好!感謝已使用軟體 800 天!” 在新增如上多語言資源項時,“XX,你好!感謝已使用軟體 X 天!” 那麼,你是怎麼新增語言資源的呢? 分別新增,“,你好!”、“感謝已使用軟體”、“年”3個,再通

WPF中使用winform控制元件WebBrowser

為了使用Winform控制元件中的WebBrowser,而WPF窗體不能直接執行WinForm控制元件,然後在WPF窗體上新增WindowsFormsHost控制元件,此WindowsFormsHost控制元件可作為Win From控制元件執行的容器。 1、首先,我們需要向

C#進階 WPF基礎一 XAML控制元件基礎、佈局

一、控制元件模型 WPF的控制元件與WinForm類似。區別在於WPF的控制元件可以用XAML手寫,並且功能更多更強大 二、XAML語言 1、概念:在WPF中用來描述控制元件的語言. 特點: 與XML、HTML語言類似,但對大小寫敏感 一個XAML標籤代表NEW一個控制元件

WPF基礎之內容控制元件

 內容控制元件(content control)      內容控制元件(content control)是更特殊的控制元件型別,他們可包含並顯示一塊內容。從技術角度看內控控制元件是可以包含單個巢狀元素的控制元件。與佈局控制元件不同的是,內容控制元件只能包含一個字

WPF ScrollViewer 滾動條滑鼠移入移出及滑鼠按下拖動時的外觀樣式

在WPF 中自定義ScrollViewer的樣式實現的效果如下圖所示:主要是滑鼠移入顯示滾動條,移出滑鼠滾動條消失,按住拖拽改變滾動條外觀顏色等; 關鍵點幾個點是:1:在ScrollViewer 的自定義模板中 定義好如下幾個事件觸發器: <EventTrigger

Android之ScrollView滾動佈局控制元件使用以及顯示新聞網頁

ScrollView滾動佈局使用原理: ①滾動產生的條件是,裡面的內容大於物理尺寸 ②ScrollView裡面只有一個子元素,這個子元素就是一個線性佈局LinearLayout,我們可以線上性佈局中新增我們需要的內容,所以ScrollView中得包裹一層,並且線性佈局中設計

指定控制元件的防止重複點選判斷

日常開發中,一般網路請求會做一些按鈕重複點選判斷(比如登入時點選登入按鈕),為了方便,可以把方法寫到基類裡面,這樣繼承類就可以直接用了。當然如果放到utils中也行。廢話不多少,直接上程式碼;變數:/*

WebKit開發實戰(一):在WPF中使用WebKit控制元件(含示例程式碼)

WebKit 是一個開源的瀏覽器引擎,可以用於程式內建瀏覽器的開發。開發時,需要將WebKit的相關檔案都拷貝至專案檔案,方便程式設計時呼叫,實現WebKit的功能。 在WPF中使用WebKit時,需要新增以下引用。 新增好引用後,就可以在WPF中使用WebKit控

Android popupwindow在指定控制元件正下方滑動彈出效果

用popupwindow實現在某空間正下方滑動彈出,並用SharedPreferences記錄選擇當前項的位置。 activity的佈局檔案: <LinearLayout xmlns:android="http://schemas.android.com/apk/

wpf XMAL中隱藏控制元件

首先,需要解決怎樣在Click事件後設置Visibility屬性?WPF中的EventSetter只能連線事件和事件處理的方法。而EventTrigger則只能定義TriggerAction,而不能新

WPF ScrollViewer(滾動條) 自定義樣式表製作 (改良+美化)

註釋直接寫在程式碼裡了   不太理解意思的 可以先去看看我上一篇  <a target=_blank class="postTitle2" id="cb_post_title_url" href="http://www.cnblogs.com/lanymy/archi