惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard
c# scrollerview滚动到指定元素位置
Hey,Coder! · 2026-02-13 · via 博客园 - Hey,Coder!

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);
        }
    }
}