c# scrollerview滚动到指定元素位置

demo示例为在scrollview中绑定stackpanel,并在其中初始化一些textblock,滚动到指定的textblock

页面

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DockPanel>
            <Button Click="Button_Click" Content="test" DockPanel.Dock="Top"/>
            <ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Visible">
                <StackPanel Orientation="Horizontal" Name="stackPanel">
                </StackPanel>
            </ScrollViewer>
        </DockPanel>
    </Grid>
</Window>

滚动相关逻辑

using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            for (int i = 0; i < 30; i++)
            {
                stackPanel.Children.Add(new TextBlock() { Text = i.ToString(), Width = 80 });
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var element = stackPanel.Children[20] as FrameworkElement;


            // 获取元素在ScrollViewer坐标系中的边界
            Rect elementBounds = element.TransformToVisual(scrollViewer)
                                       .TransformBounds(new Rect(0, 0,
                                                                element.ActualWidth,
                                                                element.ActualHeight));

            //// 获取ScrollViewer的可见区域
            //Rect scrollViewport = new Rect(scrollViewer.HorizontalOffset,
            //                               scrollViewer.VerticalOffset,
            //                               scrollViewer.ViewportWidth,
            //                               scrollViewer.ViewportHeight);
            // 减去当前的滚动偏移,得到相对于滚动区域原点的坐标
            double scrollableAreaOffsetX = elementBounds.Left + scrollViewer.HorizontalOffset;
            double scrollableAreaOffsetY = elementBounds.Top + scrollViewer.VerticalOffset;

            // 或者直接得到相对于滚动区域左上角的坐标
            Point absoluteScrollPosition = new Point(elementBounds.Left + scrollViewer.HorizontalOffset,
                                                     elementBounds.Top + scrollViewer.VerticalOffset);


            //scrollViewer.ScrollToHorizontalOffset(elementBounds.Left);
            scrollViewer.ScrollToHorizontalOffset(absoluteScrollPosition.X);
        }
    }
}

posted @ 2026-02-13 10:28  Hey,Coder!  阅读(1)  评论(0)    收藏  举报