首页 > 基础资料 博客日记
为 Avalonia 启用平滑滚动与缩放
2026-04-09 18:30:01基础资料围观1次
极客资料网推荐为 Avalonia 启用平滑滚动与缩放这篇文章给大家,欢迎收藏极客资料网享受知识的乐趣
为 Avalonia 启用平滑滚动与缩放
在 Avalonia 中,ScrollViewer 在鼠标滚轮下是没有平滑滚动的,看起来非常生硬。同时, ScrollViewer 也不支持平移、缩放等操作,这使得社区不得不使用为 PanAndZoom 等第三方控件
为此,我编写了 SmoothScroll.Avalonia 库,可以为应用中的所有 ScrollViewer 一键启用平滑滚动支持。同时,库中提供的 ScrollView 控件(继承自 ScrollViewer)还增加了平移和缩放功能
注意: 这是一个实验性项目
当前实现需要使用 Avalonia 渲染层的一些内部 API
效果如下:

使用方式
启用 ScrollViewer 的平滑滚动
安装 NuGet 包后,只需将 ScrollViewerSmoothTheme 添加到 Application.Styles 中即可
<Application
xmlns:smoothScroll="using:SmoothScroll.Avalonia.Controls">
<Application.Styles>
<... />
<smoothScroll:ScrollViewerSmoothTheme />
</Application.Styles>
</Application>
如果需要自定义样式,在你自己编写的 ScrollViewer 样式中将 ScrollContentPresenter 替换为包内提供的 ScrollPresenter 也可实现相同效果
使用 ScrollView 进行平移与缩放
ScrollView 是一个独立的控件。使用前,需要添加默认样式:
<Application
xmlns:smoothScroll="using:SmoothScroll.Avalonia.Controls">
<Application.Styles>
<... />
<smoothScroll:ScrollViewDefaultTheme />
</Application.Styles>
</Application>
它继承自 ScrollViewer,因此你可以将应用中的 ScrollViewer 直接替换为 ScrollView 来单独启用某处的平滑滚动。但与 ScrollViewer 不同的是,此控件还额外提供了缩放相关的属性和方法:
| 属性/方法 | 描述 |
|---|---|
| bool IsZoomEnabled | 是否启用缩放 |
| double ZoomFactor | 当前缩放倍率 (只读) |
| double MinZoomFactor | 最小缩放倍率 |
| double MaxZoomFactor | 最小缩放倍率 |
| void ZoomTo(double) | 缩放到指定倍率 |
| void ZoomBy(double) | 按指定增量进行缩放 |
例如,你可以将 Image 放入 ScrollView 中来创建一个图片查看器
<smoothScroll:ScrollView
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
IsZoomEnabled="True"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden">
<Image Source="avares://SmoothScroll.Avalonia.Sample/Assets/Images/4074.bmp" Stretch="UniformToFill" />
</smoothScroll:ScrollView>

实现细节将会在下篇文章中进一步介绍!
文章来源:https://www.cnblogs.com/BettaFish/p/19842673
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:

