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中最重要的一个控件,相当相当重要. 他是一个面板控件,是用来添加其他控件 但是呢 用法确实简单的很. 大概就这个样子. 你用工具箱拖, ...
随机推荐
- 转cocopods的使用
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- 7 CentOS 7网卡配置
首先重中之重:修改前一定要进行系统备份,如果是虚拟机进行快照 查看虚拟机的网卡配置 注意桥接模式和NAT模式 桥接模式:网络层面,虚拟机和PC处于同级地位,虚拟机直接和路由器相连 NA ...
- 第七篇Scrum冲刺博客
第七篇Scrum冲刺博客 一.站立式会议 提供当天站立式会议照片一张 二.每个人的工作 成员 已完成工作 明天计划完成的工作 遇到的困难 林剑峰 加入搜索页面 无 陆君健 校园卡匹配功能的实现 无 石 ...
- Innodb整体架构
如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...
- SQL注入:盲注
盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击. 服务器没有错误回显,对于攻击者来说缺少了非常重要的"调试信息". 盲注分类 1.布尔盲注 布尔很明显Ture和F ...
- windows API下的模板缓冲(stencil buffer)
在windows API搭建的OpenGL窗口中使用模板缓冲,需要在像素格式描述表中设置stencil buffer位宽为8,这样窗口会自动生成stencil buffer,然后可以在opengl环境 ...
- 201871010109-胡欢欢《面向对象程序设计(java)》第十周学习总结
201871010109-胡欢欢<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...
- 【转载】Innodb中的事务隔离级别和锁的关系
前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所 ...
- 【Spring IoC】BeanFactory 和 ApplicationContext(五)
一.BeanFactory容器 BeanFactory 容器是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.fac ...
- VIJOS-P1059 积木城堡
洛谷 P1504 积木城堡 https://www.luogu.org/problem/P1504 JDOJ 1240: VIJOS-P1059 积木城堡 https://neooj.com/oldo ...