WPF中判断滚动条滚动条滑倒了最底端

2023-11-16

先是获取滚动条的方法

(可以获取到空间内部自带的ScrollViewer)


#region 获取所有控件子级元素的方法,返回该类型的List集合


        public static List<T> GetChildObjects<T>(DependencyObject obj) where T : FrameworkElement
        {
            DependencyObject child = null;
            List<T> childList = new List<T>();


            for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
            {
                child = VisualTreeHelper.GetChild(obj, i);


                if (child is T)
                {
                    childList.Add((T)child);
                }
                childList.AddRange(GetChildObjects<T>(child));
            }
            return childList;
        }


        #endregion

#region 内部滚动条滚动到底部后接着滚动外部滚动条


        private void 控件名_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            List<ScrollViewer> scrollList = GetChildObjects<ScrollViewer>((控件的类型)sender);//查找改控件内部的ScrollViewer集合
            ScrollViewer scroll = scrollList[0];
            double delta = e.Delta;
            double verticalOffset = scroll.VerticalOffset;
            if (delta < 0)
            {
                scroll.ScrollToVerticalOffset(verticalOffset += 25);
                if (IsVerticalScrollBarAtButtom(scroll))
                {
                    List<ScrollViewer> parentscrollList = GetChildObjects<ScrollViewer>((控件的类型)上一节控件的父级控件);
                    ScrollViewer parentScroll = parentscrollList[0];
                    double parentdelta = e.Delta;
                    double parentverticalOffset = parentScroll.VerticalOffset;
                    if (listboxdelta < 0)
                    {
                        parentScroll.ScrollToVerticalOffset(parentverticalOffset += 25);
                    }
                    else
                    {
                        parentScroll.ScrollToVerticalOffset(parentverticalOffset -= 25);
                    }
                }
            }
            else
            {
                scroll.ScrollToVerticalOffset(verticalOffset -= 25);
            }
        }


        #endregion


#region 判断滚动条是否到达最底部的代码 需要传进来一个ScrollViewer对象


        public bool IsVerticalScrollBarAtButtom(ScrollViewer s)
        {
            bool isAtButtom = false;
            double dVer = s.VerticalOffset;
            double dViewport = s.ViewportHeight;
            double dExtent = s.ExtentHeight;
            if (dVer != 0)
            {
                if (dVer + dViewport == dExtent)
                {
                    isAtButtom = true;
                }
                else
                {
                    isAtButtom = false;
                }
            }
            else
            {
                isAtButtom = false;
            }
            if (s.VerticalScrollBarVisibility == ScrollBarVisibility.Disabled
                || s.VerticalScrollBarVisibility == ScrollBarVisibility.Hidden)
            {
                isAtButtom = true;
            }
            return isAtButtom;
        }


        #endregion

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF中判断滚动条滚动条滑倒了最底端 的相关文章

  • 阻止 ItemsControls 共享过滤器

    我有两个 ItemsControl 一个是 ListView 另一个是我正在开发的自定义控件 我已将两个控件的 ItemsControl ItemsSource 属性设置为同一个 IEnumerable 对象 在本例中为 List 我将筛选
  • .NET WPF 窗口淡入和淡出动画

    下面是窗口淡入和淡出动画的代码片段 Create the fade in storyboard fadeInStoryboard new Storyboard fadeInStoryboard Completed new EventHand
  • 了解用户是否更改了 DataGrid 中的数据的最佳方法是什么?

    我想知道每次用户修改 WPF DataGrid 中的数据时 我可以使用一个事件来做到这一点吗 或者我可以用来覆盖全套数据更改 添加行 删除行 修改行等 的最小事件集是什么 我知道这可能超出了你的要求 但是一旦你这样做了 就很难回头了 无论您
  • RenderTargetBitmap 内存泄漏

    我正在尝试使用 RenderTargetBitmap 渲染图像 每次我从 RenderTargetBitmap 创建一个实例来渲染图像时 内存都会增加 完成后内存永远不会释放 这是代码 RenderTargetBitmap rtb new
  • WPF 应用程序在每个系统规模上具有相同的大小(与规模无关)

    有没有办法让 WPF 应用程序在每个系统规模上获得相同的大小 当我改变时更改文本 应用程序和其他项目的大小在windows系统设置中125 推荐 to 100 在全高清屏幕中 我的 WPF 应用程序变得太小 为了实现独立的系统缩放应用程序
  • ItemTemplate 与 ControlTemplate

    我对WPF的学习感到困惑 我看到 ControlTemplate 用于确定列表框中每个项目的外观 这不是 ItemTemplate 在列表框中的用途吗 有什么不同 ControlTemplate 允许您更改现有控件的外观和感觉 例如 使普通
  • WPF DataGrid DataBindingComplete 事件在哪里?

    数据绑定完成后 我需要采取一些操作 例如 根据其他一些单元格使某些单元格只读 在WinForm DataGridView中 我曾经在DataBindingComplete事件中执行此操作 但是 我在 WPF DataGrid 中找不到这样的
  • 在单独的线程上显示 WPF-“NotifyIcon”

    我目前正在开发一个 Office 加载项 我需要显示一个显示进度的通知对话框 我正在使用Philipp Sumi 的 wpf notifyicon http www codeproject com Articles 36468 WPF No
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • 如何将 MouseDown 事件放入样式中?

    这有效 XAML
  • Prism自定义确认交互

    我使用 Prism Unity WPF 和 Mvvm 在应用程序中创建了一个自定义确认窗口 我需要有关需要发送回视图模型的通知的帮助 我在详细记录视图中有这个 我们称之为 MyDetailView
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 使用 Visual Studio 2012 在 wpf 工具包中找不到 AutoCompleteBox

    这确实是一个想要的功能 AutoCompleteBox 显然不是 AutoCompleteComboBox 但是 Visual Studio 2012 找不到 AutoCompleteBox 控件 但我没有在早期版本的vs中尝试过 所以这可
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的
  • 可观察集合未因 UI 更改而更新

    我正在尝试将可观察集合绑定到用户控件 但它不会在用户更改时更新 但在通过代码更改用户控件时它会更新 以下是我尝试过的一个例子 它可能有点长 但它正在运行 因此您可以按原样复制并粘贴代码 请参阅帖子末尾我的问题 客户 cs using Sys
  • 在 MVVM 中哪里可以捕获异常?

    我的视图模型类有一个连接到服务的方法 不确定这是否是一个好的实践 或者视图模型是否应该是严格的属性和属性更改机制 当然 我想在连接或断开连接时处理任何可能的 WCF 异常 让我们使用未找到端点作为示例 考虑到这是一个我想引起用户注意的异常
  • iTextSharp 从 WPF 固定文档生成 PDF

    我有一个简单的 WPF 应用程序 可以显示和打印一些内容 使用固定文档进行报告 如何使用免费且开放的解决方案从中生成 PDF 比如iTextSharp WPF 固定文档 也称为 XPS 文档 是对 PDF 的明显改进 它具有 PDF 所缺乏
  • WPF 网格布局

    是否可以在 WPF 中使用 Grid 来设计类似的东西 设计列很容易 但是行呢 或者有没有更好的解决方案 比如另一个容器 将每个矩形想象为模块 GroupBox 创建一个包含两列的外部网格 在此网格中 放置另外两个网格 每列一个 这将导致所
  • MVVM 中动态创建 MenuItem-Separator 的 WPF 光学样式

    我有一个MenuItem从动态创建其子菜单项ItemsSource 财产 对于分组 我在菜单中有分隔符 分隔符是由 ItemsSource 集合中的 ControlTemplate 为每个空条目创建的MenuItem ItemContain
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3

随机推荐