2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
原文: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.SizeChanged 和 ScrollViewer.ViewChanged 事件同时使用,这样就可以拿到用户滚动和修改大小
uwp - XAML ScrollViewer's child bring into view event - Stack Overflow
2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见的更多相关文章
- 2019-4-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
title author date CreateTime categories win10 uwp 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-04-29 10:40:33 + ...
- 2019-4-29-WPF-如何判断一个控件在滚动条的里面是用户可见
title author date CreateTime categories WPF 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-4-29 9:42:2 +0800 2019 ...
- Win10 UWP开发系列——开源控件库:UWPCommunityToolkit
在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...
- win10 uwp 好看的时间选择控件
本文告诉大家我找到的好看的时间选择控件 先给大家看一下图,然后就知道我说的是什么 首先需要安装 Nuget ,搜索 DeanChalk.UWP.TimePicker 或输入Install-Packag ...
- win10 uwp 如何判断一个对象被移除
原文:win10 uwp 如何判断一个对象被移除 有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要判断对象设置空时是否被回收. 本文告诉大家一 ...
- 在 UWP 中实现 Expander 控件
WPF 中的 Expander 控件在 Windows 10 SDK 中并不提供,本文主要说明,如何在 UWP 中创建这样一个控件.其效果如下图: 首先,分析该控件需要的一些特性,它应该至少包括如下三 ...
- Win10系列:WinJS库控件
在介绍了如何使用标准的HTML控件以及WinJS库中提供的新控件之后,下面来着重介绍WinJS库中几种常用的控件. (1)ListView控件 在开发Windows应用商店应用时可以使用ListVie ...
- VC++:制作一个控件注册的小工具
在平时的工作中,时常需要注册与反注册ActiveX控件,有时需要判断控件是否已经注册. 所以通过查找资料编写了一个控件注册的小工具,欢迎学习交流,不当之处请多多交流. 先直接上图: 主要代码: ...
- UWP&WP8.1 基础控件——Grid
Grid是一个面板控件 Grid是UWP和WPF,WP8.1中最重要的一个控件,相当相当重要. 他是一个面板控件,是用来添加其他控件 但是呢 用法确实简单的很. 大概就这个样子. 你用工具箱拖, ...
随机推荐
- odoo12 权限配置1
权限配置文档说明,这里使用公司开发的两个权限配置模块,可以快速的帮助你来配置复杂的odoo权限. 安装以下两个模块,SystemGroups模块是快速帮助你批量添加,创建基础群组需要用到的模块 Bas ...
- Linux磁盘信息查询及删除文件操作
查询磁盘容量 $df -hl 删除文件固定行数 (1)删除第一行 $sed -i '1d' a.txt (2)删除指定行数 $sed -i '1,100d' a.txt 删除末尾行 $sed -i ' ...
- Django Form 的主要内置字段介绍
修改 urls.py,添加 path('field.html', views.field), 在 templates 下创建 field.html, 内容如下: <!DOCTYPE html&g ...
- flask那些事(一)
flask配置文件 flask路由系统 @app.route() 装饰器中的参数 如果不明白装饰器 点击这里 methods : 当前 url 地址,允许访问的请求方式 @app.route(&quo ...
- jersey实现RESTful接口PUT方法JSON数据传递
项目中使用的是org.json包 maven中的配置如下: xml <!-- https://mvnrepository.com/artifact/org.json/json --> &l ...
- vm|vmware workstation 15|14 pro 激活|密钥|序列号|许可证
VMware Workstation Pro 15 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA VF750-4MX5Q-488DQ-9WZE9-ZY2D6 UU54R-FV ...
- Linux---文件压缩与解压缩命令
压缩格式: zip.gz.bz2.tar .tar.gz.tar.bz2.tar.xz.xz.z 最常用的是.tar.gz格式和.tar.bz2格式 1.zip格式 命令 说明 zip 压缩文件名 ...
- 搭建稳固的MySQL运维体系
MySQL 监控要点 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例 ...
- echars 饼状图 轮循 水平翻转
code: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Python Django项目部署 Linux 服务器
项目依赖: Linux Centos7 (阿里云轻量级服务器) + Python 3.7.2 + Django 2.2.1 + restframework 3.9.4 + mysql 5.7 1 安装 ...