原文:2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见

title author date CreateTime categories
win10 uwp 如何判断一个控件在滚动条的里面是用户可见
lindexi
2019-11-29 08:42:36 +0800
2019-04-29 10:15:38 +0800
Win10 UWP

在 UWP 中如何知道一个元素是在滚动条的显示大小内用户可以看到这个控件?如果需要在控件在滚动条里面用户可以看到的时候触发某个事件,在用户看不到的时候触发另一个事件可以怎么做?

昨天星期八再娶你 大佬问我如何判断在滚动条内可以看到某个元素,他需要在滚动条里面放一个视频播放器,在用户看不到这个播放器的时候自动停下这个播放器

在 UWP 的判断会比在 WPF 中复杂一些,我写过WPF 如何判断一个控件在滚动条的里面是用户可见但是在 UWP 中的小伙伴,也就是做 UWP 的大佬对 API 的设计会更加诡异

在 UWP 没有 ScrollChanged 事件只有ScrollViewer.ViewChanged 事件,但是这个事件和 WPF 的触发不相同的在于,如果我有外层的控件修改了滚动条的大小,不会触发这个事件。在 ScrollViewer.ViewChanged 只有在用户滚动或缩放完成之后才会触发,同时这个事件的参数ScrollViewerViewChangedEventArgs 只有一个表示现在是用户交互的过程还是结束的变量,所以通过这个事件判断控件是否在滚动条可见是不可靠的

昨天星期八再娶你 大佬告诉我一个可以使用的方法是通过LayoutUpdated 事件拿到触发,在布局属性修改的时候、在窗口修改的时候在运行时的布局的时候都会触发这个事件

LayoutUpdated可以在控件第一次加载的时候触发,可以在用户滚动的时候触发

LayoutUpdated 通过判断控件的左上角坐标和控件的大小可以判断用户是否可以看到这个控件

在 UWP 拿到一个控件相对于上一层控件的左上角坐标可以使用下面方法

            var top = control.TransformToVisual(StackPanel).TransformPoint(new Point());

这个方法和 WPF 的 TranslatePoint 方法相同

判断滚动条可见大小不能从方法的参数拿到,需要直接拿滚动条控件,这样会存在一个坑在于时机的问题,和 WPF 不相同,此时的事件很难做到精确拿到滚动条的当前的大小和移动距离

    var viewBounds = new Rect(new Point(ScrollViewer.HorizontalOffset, ScrollViewer.VerticalOffset), new Size(ScrollViewer.ViewportWidth, ScrollViewer.ViewportHeight));

在 UWP 的矩形判断里面的方法已经不存在,需要自己写一个辅助方法

        private static bool RectIntersects(Rect a, Rect b)
{
return !(b.Left > a.Right
|| b.Right < a.Left
|| b.Top > a.Bottom
|| b.Bottom < a.Top);
}

判断两个矩形是否相交就可以知道控件是否用户可以看到,如果想判断用户可以完全看到这个控件需要再写一个 Contain 方法

        private void CheckControlShow()
{
UIElement control = TextBlock; var top = control.TransformToVisual(StackPanel).TransformPoint(new Point());
var controlBounds = new Rect(top, control.DesiredSize); var viewBounds = new Rect(new Point(ScrollViewer.HorizontalOffset, ScrollViewer.VerticalOffset), new Size(ScrollViewer.ViewportWidth, ScrollViewer.ViewportHeight)); if (RectIntersects(viewBounds, controlBounds))
{
Debug.WriteLine("歪楼");
}
else
{
Debug.WriteLine("不歪楼");
}
}

如果觉得 LayoutUpdated 触发的次数实在太多,那么请使用FrameworkElement.SizeChangedScrollViewer.ViewChanged 事件同时使用,这样就可以拿到用户滚动和修改大小

uwp - XAML ScrollViewer's child bring into view event - Stack Overflow

2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见的更多相关文章

  1. 2019-4-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见

    title author date CreateTime categories win10 uwp 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-04-29 10:40:33 + ...

  2. 2019-4-29-WPF-如何判断一个控件在滚动条的里面是用户可见

    title author date CreateTime categories WPF 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-4-29 9:42:2 +0800 2019 ...

  3. Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

    在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...

  4. win10 uwp 好看的时间选择控件

    本文告诉大家我找到的好看的时间选择控件 先给大家看一下图,然后就知道我说的是什么 首先需要安装 Nuget ,搜索 DeanChalk.UWP.TimePicker 或输入Install-Packag ...

  5. win10 uwp 如何判断一个对象被移除

    原文:win10 uwp 如何判断一个对象被移除 有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要判断对象设置空时是否被回收. 本文告诉大家一 ...

  6. 在 UWP 中实现 Expander 控件

    WPF 中的 Expander 控件在 Windows 10 SDK 中并不提供,本文主要说明,如何在 UWP 中创建这样一个控件.其效果如下图: 首先,分析该控件需要的一些特性,它应该至少包括如下三 ...

  7. Win10系列:WinJS库控件

    在介绍了如何使用标准的HTML控件以及WinJS库中提供的新控件之后,下面来着重介绍WinJS库中几种常用的控件. (1)ListView控件 在开发Windows应用商店应用时可以使用ListVie ...

  8. VC++:制作一个控件注册的小工具

    在平时的工作中,时常需要注册与反注册ActiveX控件,有时需要判断控件是否已经注册.   所以通过查找资料编写了一个控件注册的小工具,欢迎学习交流,不当之处请多多交流. 先直接上图:   主要代码: ...

  9. UWP&WP8.1 基础控件——Grid

    Grid是一个面板控件  Grid是UWP和WPF,WP8.1中最重要的一个控件,相当相当重要. 他是一个面板控件,是用来添加其他控件   但是呢 用法确实简单的很. 大概就这个样子. 你用工具箱拖, ...

随机推荐

  1. python3类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  2. 如何在一个ubuntu系统上搭建SVN版本控制工具

    有话说,由于公司项目部署需要,将Windows工程迁移到Linux,通过调查确定使用Ubuntu的Linux操作系统.那么如何快速搭建和Windows一样快捷方便的开发环境就很重要了.本文讲述如何在一 ...

  3. sparkSQL中的example学习(2)

    UserDefinedUntypedAggregate.scala(默认返回类型为空,不能更改) import org.apache.spark.sql.{Row, SparkSession} imp ...

  4. Innodb整体架构

    如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...

  5. Java基础回顾一

    1.JDK和JRE的区别: JDK:java开发工具包,提供java的开发环境和运行环境 JRE:java运行环境,为java的运行提供所需要的环境 2. ==和qruals的区别: == 基本类型: ...

  6. 洛谷 P5564: [Celeste-B]Say Goodbye

    题目传送门:洛谷 P5564. 题意简述: 有 \(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(cnt_i\) 个节点,满足 \(cnt_1+cnt_2+\cdots+cn ...

  7. 201871010132--张潇潇--《面向对象程序设计(java)》第十四周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  8. day38_8_22数据库(navicat操作)

    补充: exist存在EXISTS关字键字表示存在.在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False. 当返回True时,外层查询语句将进行查询当返回 ...

  9. 没有重写接口方法,IDEA没有报错。

    今天在IDEA写拦截器的时候遇到点困惑,继承了HandlerInterceptor没有报错,我一直认为他会提醒,要重写方法.如下图 通过查资料,嗯,终于找到原因来,先来上HandlerIntercep ...

  10. Maven 本地仓库同步到私服中

    步骤: 第一步:找到安装私服的目录中plexus.properties文件. 地址:C:\Windows\apache-tomcat-7.0.26\webapps\nexus-2.7.0-06\WEB ...