如何允许 UWP ListView 滚动到最后一项?

2024-01-09

我有一个 ListView,其中包含一堆大小不规则的项目。当您滚动 ListView 时,最后一项的底部将最终位于控件的底部:您无法继续滚动。

如果最后一项小于控件,我想要top最后一个项目能够滚动到控件的顶部(如果该项目比控件大,我对默认行为很好;在这种情况下,项目的顶部将滚动到控件的顶部) ListView控件满足我的设计)。 (这类似于 Visual Studio Code 中的行为editor.scrollBeyondLastLine设置为 true)

I've almost已经可以工作了,但还没有完全实现。在我的尝试中,我将ListView这样我就可以覆盖PrepareContainerForItemOverride.

然后,我尝试向项目的下边距添加足够的额外空间,以便项目的顶部将位于 ListView 的顶部。

  protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);

        var lvi = element as ListViewItem;
        if (lvi == null) { return; }

        var currentIndex = this.Items.IndexOf(item);
        if (currentIndex == (this.Items.Count - 1))
        {
            var sv = this.ScrollViewer();
            lvi.Measure(new Size(sv.ViewportWidth, double.PositiveInfinity));

            var slackSpace = sv.ViewportHeight - lvi.DesiredSize.Height;
            if (slackSpace > 0)
            {
                lvi.Margin = new Thickness(lvi.Margin.Left, lvi.Margin.Top, lvi.Margin.Right, slackSpace + lvi.Margin.Bottom);
            }                
        }
    }
}

(在这段代码中,this.ScrollViewer()只是一个小小的扩展方法,可以找出ScrollViewer从任何ListView。我在这里用它来尝试传递一些合理的东西lvi.Measure.)

这不太有效,因为DesiredSize.Height of the ListViewItem最终比Height所渲染的ListViewItem(我不知道为什么)。

如果我知道,我实际上可以接受这种行为作为妥协DesiredSize.Height would always比需要的要大……但我敢打赌这实际上不是真的。

所以我显然需要插入渲染管道的不同部分来管理它。但我不知道在哪里。

我应该子类化ListView's ScrollViewer不知何故(因为我认为ScrollViewer是真正布置孩子的ListViewItem控制?)?还有其他方法可以做到这一点吗?或者这根本就是不可能的?


理想情况下是ScrollViewer的工作是在安排其子项(本例中为面板)后添加额外的间距。尽管如此,它仍然必须查看面板的最后一个子尺寸,才能确切地知道它应该添加多少空间。

但是由于ScrollViewer被封了,不知道是否真的可行。

另一个黑客,是创建一个自定义StackPanel我们可以在其中调整测量的高度,以便最后一个项目将滚动到顶部。

底部的实际填充取决于ScrollViewer's ViewportHeight因此需要多次通过测量布局步骤。

public class BottomPaddedStackPanel: StackPanel
{
    private ScrollViewer scroll = null;

    public BottomPaddedStackPanel()
    {
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        if (scroll == null)
            InitScrollViewerData();

        Size panelSize = base.MeasureOverride(availableSize);
        var lastChild = this.Children[this.Children.Count - 1];

        if (scroll == null || scroll.ViewportHeight == 0)
            return panelSize;

        // add more space at the bottom to be able to scroll the last item at the top
        if (lastChild.DesiredSize.Height < scroll.ViewportHeight)
            panelSize.Height += scroll.ViewportHeight - lastChild.DesiredSize.Height;

        return panelSize;
    }

    private void InitScrollViewerData()
    {
        var lastChild = this.Children[this.Children.Count - 1];
        var lv = ItemsControl.ItemsControlFromItemContainer(lastChild);
        Border rootBorder = VisualTreeHelper.GetChild(lv, 0) as Border;
        scroll = rootBorder.Child as ScrollViewer;
        scroll.SizeChanged += (o, ev) => InvalidateMeasure();
    }
}

设置为列表的布局面板:

<ListView ItemsSource="{x:Bind Items}">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <local:BottomPaddedStackPanel />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何允许 UWP ListView 滚动到最后一项? 的相关文章

  • 如何处理错误“MDM 2009 处理元数据文件时发现重复类型”?

    我正在尝试使用 C WinRT 编写 UWP 程序 但是当我直接和间接引用 Windows 运行时组件两次时 收到以下编译错误 重复类型 Core ALBUM 发现正在处理元数据文件 我对COM了解不多 我搜索了很多信息但没有帮助 我应该怎
  • UWP,如何处理图像和缩放?

    我们有一个 Xamarin Forms 项目 它将在 Android iOS 和 UWP 上运行 在 Android 上 不同的文件夹中有许多不同的图像 以支持大量不同的屏幕 和 PPI 在 iOS 上 您有类似的系统 2x 3x 等 我一
  • 如何获取所有子文件夹及其文件 - UWP

    我在桌面上有一个名为student names 的固定文件夹 它包含子文件夹 每个子文件夹都包含其文件 现在我想将这些子文件夹及其相应的文件名存储在数组列表中 这怎么可能 UWP 应用程序不能directly访问文件夹 应用程序文件夹除外
  • Xbox 上的 UWP 应用

    在围绕 Windows 10 的活动和促销期间 我总是看到 UWP 应用程序可以在 Microsoft 系列的所有设备上运行 为了确认这一点 当我在浏览器上浏览 UWP 应用程序并单击以查看应用程序页面的源代码时 我能够看到以下元数据 那
  • 如何访问 UWP 应用中的注册表项?

    我想通过 UWP 应用程序访问 windows10 注册表项 键为 HKEY LOCAL MACHINE SOFTWARE MyCompanyName MyName 我找不到任何函数调用来完成它 请指示我该怎么做 谢谢你 如果您的应用程序是
  • DEP0600:部署失败。 XmlException - '.'(十六进制值 0x00)是无效字符

    MS VS2017 微软 Visual Studio 2017 DEP0600 部署失败 XmlException 十六进制值 0x00 是无效字符 编辑开始 解决方案可能就在附近 请保留建议一天 在 回复下面的评论 我已将原来的VS201
  • 如何将 UWP StorageFile 转换为 .NET FileInfo?

    现在 UWP 支持 NET Standard 2 0 它可以访问更多 System IO 命名空间 包括Fileinfo https msdn microsoft com en us library system io fileinfo v
  • UWP 中的串行设备通信问题

    我有一个特殊的问题 我正在尝试与 UWP 项目中需要串行通信的外围单元进行通信 我在用Windows Devices SerialCommunication 为了演示目的 我创建了一个新页面 其中有两个按钮 以及两个不同的单击处理程序 一个
  • DEP0800:升级到 VS 2015 Update 3 后无法部署 UWP 应用

    升级到 VS 2015 Update 3 后 我很难让我的 UWP 应用程序在调试模式下部署 2 gt 检查是否安装了所需的框架 2 gt 框架 Microsoft VCLibs 140 00 Debug x86 当前未安装应用程序包版本1
  • 通过 INotifyPropertyChanged 更新 ListView 的 ItemsSource

    回答的同时其他问题 https stackoverflow com q 33553691 2681948我已经进入了一件我试图理解的事情 我有一个ListView which 项目来源绑定到我的页面的属性 页面实现了INotifyPrope
  • 使用 Windows.Services.Store Addons 模拟购买

    我编写了一个基于 Windows Services Store 的应用内购买系统 现在我希望确保我的用户得到他们所付出的代价 在旧的 API 中 我可以模拟购买 我怎样才能让每次购买成功 而不需要每次都从我的信用卡 贝宝中注入真钱 我无法返
  • 无法在后台任务中调用 Task.Run()

    我想在后台任务的线程中做一些事情 所以我尝试使用 Task Run 但它不起作用 任何人都可以向我展示另一种在后台任务中创建线程的方法 这是我的代码 public sealed class KatzBackgroundTask IBackg
  • CordovaApp.Windows.jsproj(70,3):错误 MSB4019:导入的项目

    完整错误日志 C Users user Development Tutorials cordova tutorial hello platforms windows CordovaApp Windows jsproj 70 3 error
  • 何时在 UserControl 上使用模板化控件?

    我正在寻找一些有关如何在 WinRT 中创建自定义控件的教程 我有一个问题 假设我想创建一个包含一些内容的简单控件 例如左侧有图像 右侧有几个 TextBlock 的网格 我的意思是 一些简单的事情 比如
  • 如何在Unity中使用MediaCapture类访问相机预览帧?

    我正在尝试在 Unity 应用程序的脚本中访问 Hololens 的相机预览帧 但遇到一些问题 我想使用 MediaCapture 类访问相机预览 我知道它可以在 UWP 应用程序中实现 但我想在 Unity 中实现 在 UWP 应用程序中
  • 我们可以将 WORD 加载项发布到 Windows 10 应用商店吗?

    The WORD Add in是使用开发的VSTO在 Visual Studio 2015 中 它有一个自定义功能区 其中包含一些按钮 可以对 WORD 文档执行某些内容操作 这可以转换为UWP app https msdn microso
  • “此应用程序只能在应用程序容器的上下文中运行。” - Visual Studio 2015 开发新手

    我有点绝望了 我几个小时以来一直在尝试解决以下问题 我开发了一个应用程序 现在尝试使用 Visual Studio 2015 的安装向导扩展来安装 一切都在构建或 没有错误 但是当我打开应用程序时 它突出显示它只能在应用程序容器的上下文中打
  • 弹出窗口或弹出窗口显示附加信息

    我想在我的应用程序顶部显示带有附加信息的弹出窗口 我的信息是Listview大约 500 个项目我都尝试过 有问题flyout gt 它里面可能有scrollViewer 所以我的列表视图不能正确虚拟化 其他一切都可以 有我的代码 Flyo
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 切换 PC 时,InkCanvas 笔画未以正确的边界渲染

    我有一个 UWP 应用程序 使用带有加载和保存墨迹按钮的 UWP InkCanvas 我在一台笔记本电脑上使用该应用程序进行了绘图 将墨迹保存为 gif 嵌入 isf 并将 gif 文件发送到另一台屏幕较小的笔记本电脑上进行尝试 当使用同一

随机推荐

  • Java 中的虚拟(派生)属性是什么?

    我应该创建一个派生属性 该属性将具有处理 Mark E Brown 等值的访问器和修改器 我不明白这个词 这对我来说是新的 帮助 public String getFullName return fullName getFirstName
  • 如何增加雷达图 MPAndoid Chart 的大小?

    I want to increase size of MPAndroid Radar Chart I observed that the size increases gradually when i increase size of th
  • 使用mockito“无法解析方法”

    I use org springframework security core Authentication其中有一个方法 Collection
  • 字符串格式正值和负值以及条件颜色格式 XAML

    我正在寻找一种简单的方法来使用以下标准格式化结果 如果为正 则添加加号并将其显示为绿色 如果为负则添加减号并将其显示为红色 我已经完成了一半 我只是不知道获得颜色格式的最简单方法是什么 有没有一种不使用值转换器的方法
  • cpp文件中的C++变量可以定义为特殊符号β吗

    我们可以使用特殊字符在 C C 中定义变量吗 例如 double 如果是 如何实现这一目标 根据CPP标准工作草案 N4713 5 10 标识符 lex name 标识符是任意长的字母和数字序列 标识符中的每个通用字符名应指定一个字符 该字
  • iOS:如何获取安装引用源

    我想了解用户如何使用什么来源 归因 安装应用程序 对于 Android 可以获取引用者的 URL 但我还没有找到针对 iOS 的明显方法 有外部服务 例如 AppsFlyer http support appsflyer com entri
  • 将 QString 转换为 std::string

    我看过其他几篇关于将 QString 转换为 std string 的帖子 它应该很简单 但不知怎的 我收到了一个错误 我的代码使用cmake编译成VS项目 我使用的是VS Express 所以QT库没有问题 而且我编写的GUI除了这部分之
  • ionic-item 颜色和 href 不起作用

    我开始了一个基于侧菜单模板的离子项目 我试图更改侧面菜单中每个元素的背景颜色 我希望每个项目都有不同的颜色 我尝试添加离子颜色类
  • 重塑数据(更快的方法)

    我发现了一张频率表 今天计数 我必须扩展到原始值的数据框架 我能够做到这一点 但想知道是否有更快的方法使用 reshape 包 r data table 原来的表是这样的 i1 i2 i3 i4 m f 1 0 0 0 0 22 29 2
  • 从字符串中删除所有非 utf-8 符号

    我有大量的文件和解析器 我要做的就是去掉所有非 utf 8 符号并将数据放入 mongodb 中 目前我有这样的代码 with open fname r as fp for line in fp line line strip line l
  • Typeorm子查询添加选择

    我是新使用的typeorm这是我第二次感到困惑typeorm 我有以下查询 SELECT t1 a t1 b t2 a SELECT TOP 1 t1 a FROM table1 t1 WHERE t1 b t2 a ORDER BY t1
  • 将 pandas 中的时间序列重新采样为每周间隔

    如何将 pandas 中的时间序列重新采样为每周频率 其中每周从任意一天开始 我看到有一个可选的关键字库 但它只适用于短于一天的时间间隔 你可以通过锚定偏移量 http pandas pydata org pandas docs stabl
  • C++ boost 库 - 写入 ini 文件而不覆盖?

    我正在尝试使用 boost 库的 ini 解析器和属性树编写 ini 文件 该文件是分阶段写入的 我的意思是每个函数都会写入其中的一部分 最后 我只留下最后的输出 而不是写下所有内容 我在编写时使用的示例代码 property tree p
  • selenium.open() 在迭代测试中变得无响应

    我有一组必须使用不同参数执行的测试步骤 我已在 Eclipse TestNG 中编写了此脚本 由 Excel 工作表提供的参数驱动 现在 测试步骤包括设置页面的属性 然后打开另一个页面以确认该属性已设置 所以 实际上 我使用了一个简单的se
  • Spark,如何打印查询?

    我正在使用 pyspark df self sqlContext read option es resource indexes format org elasticsearch spark sql load df df filter df
  • 如何用Java管理Linux文件权限?

    是否有任何机制来获取和设置文件 目录权限 比如我想以shell的方式显示一个文件的权限 rwxr xr 使用 Java 可以做到这一点吗 我知道里面有一些方法File类来知道文件是否canExecute canRead and canWri
  • Apple-app-site-association 文件无法下载

    我已将我的 apple app site association 文件上传到我的 HTTPS Web 服务器的根目录之后 我已在 xcode 中添加了我的关联域 我已遵循 Apple 通用链接教程 SWC 拒绝重定向到 https exam
  • 为什么网格模板区域中缺少的网格区域名称会创建额外的轨道?

    我创建了一个简单的 CSS 网格 我决定不指定grid template grid template columns grid template rows特性 相反 我开始于grid template areas 并分配地区名称 to th
  • 推特引导程序中缩小尺寸?

    当 在我的浏览器中 我缩小两次 ctrl ctrl 而不是默认的 使用 ctrl 0 查看时 我喜欢使用 twitter bootstrap 的所有项目的大小 缩放会影响字体大小 响应式设计以及我想使用 bootstrap 的其他十几个重要
  • 如何允许 UWP ListView 滚动到最后一项?

    我有一个 ListView 其中包含一堆大小不规则的项目 当您滚动 ListView 时 最后一项的底部将最终位于控件的底部 您无法继续滚动 如果最后一项小于控件 我想要top最后一个项目能够滚动到控件的顶部 如果该项目比控件大 我对默认行