UWP中弹出框屏幕适配问题
上次在UWP中的消息提示框(二)中谈到弹出框在虚拟导航栏的手机上被遮挡问题,今天接就着扯。
上次给用户控件指定的宽高都是Window.Current.Bounds的宽高,而这个获取到的是包含应用程序窗口的高度和宽度(以有效(视图)像素为单位)的 Rect 值,在手机上是状态栏和虚拟导航栏的高度也算进去的,所以通过这个宽高去设置一些控件的宽高是不那么准确的。
其实还有另一个API:Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().VisibleBounds,VisibleBounds顾名思义是获取窗口(应用程序视图)的可见区,在手机上是不包含状态栏和虚拟导航栏的高度,所以在一些弹窗需要在靠屏幕底部放置按钮的需求里可能这个API更适合我们。
但是只给弹窗的宽高指定为Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().VisibleBounds获取的宽高也还是有问题的,Popup在弹出的时候默认锚点是屏幕最左上角(不排除状态栏),所以在状态栏显示的情况就会出现底部高度偏上的情况,还需要设置一个距上边距为状态栏高度的Margin。还有别忘记虚拟导航栏的手机可以隐藏、显示虚拟导航栏,所以应该还需要订阅VisibleBoundsChanged的事件
来看看代码,在上次的代码上做修改,需要在用户控件的构造和可见区的宽高变化时区指定宽高,所以写成一个方法:
private void MeasurePopupSize()
{
this.Width = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().VisibleBounds.Width; double marginTop = ;
if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
marginTop = Windows.UI.ViewManagement.StatusBar.GetForCurrentView().OccludedRect.Height;
this.Height = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().VisibleBounds.Height;
this.Margin = new Thickness(, marginTop, , );
}
构造改成:
private MessagePopupWindow()
{
this.InitializeComponent();
m_Popup = new Popup();
Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().VisibleBoundsChanged += (s,e)=>
{
MeasurePopupSize();
};
MeasurePopupSize();
m_Popup.Child = this;
this.Loaded += MessagePopupWindow_Loaded;
this.Unloaded += MessagePopupWindow_Unloaded;
}
示例代码也做了更新,欢迎围观 https://github.com/kkkeyboy/UWPPopup
UWP中弹出框屏幕适配问题的更多相关文章
- 关于webdriver中弹出框的定位
对于webdriver中弹出框的定位,需要引入这个包: import org.openqa.selenium.Alert; 具体语句为: Alert alert= driver.switchTo(). ...
- ie中弹出框中元素的定位
用selenium在ie8浏览器中定位一个弹出框时,直接用ie developer tools可能不一定能定位到,有一个解决的办法是直接在url后面加上#noHide,刷新后,然后再用ie devel ...
- miniUI中弹出框问题
---恢复内容开始--- 设置页面弹出框并提交弹出框内容 弹出按钮 <a class="btn_color_1" onclick="onEdit(0)"& ...
- elementui中弹出框不能自动换行的解决方案
我们的需求是将客户给的这串无头脑的数据放进这个弹出框?! 可以看到element提供的弹出框并不提供换行的功能 所以这时候我们应该咋整呢?? 我试过了在这个弹出框中套个盒子给盒子添加宽?然后他自己就折 ...
- vue中选中弹出框内的表格
一:可多选情况且对应勾选 由于是弹出框形式,所以会出现新增DOM与数据的改变问题,因此要使用$nextTick,不然一开始弹出得时候DOM还没有生成,却要获取DOM会报错:这种多选情况会出现一个bug ...
- UpdatePane中弹出框
ScriptManager.RegisterClientScriptBlock(this.UpdatePanel21, typeof(UpdatePanel), "提示",&quo ...
- elementUI vue table 操作选项中弹出框确定dialog
1.html <el-table-column label="操作" width="150" fixed="right" align= ...
- Java中弹出框的集中方式
1.显示一个错误对话框,该对话框显示的 message 为 'alert': JOptionPane.showMessageDialog(null, "alert", " ...
- 干掉MessageBox,自定义弹出框JMessbox (WindowsPhone)
先上效果图 QQ退出效果 ...
随机推荐
- WPF+SignalR实现用户列表实时刷新
原文:WPF+SignalR实现用户列表实时刷新 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5 ...
- 使用Boolean类型同步锁引起异常的分析
原文地址 http://topic.csdn.net/u/20080710/19/f61cb4db-ddff-4457-a26a-4ea578b0cc6c.html?87447500 http://w ...
- NOIP模拟 拆网线 - 贪心策略+dp
题目大意: 给一颗n个节点的树,保留最少的边,使得每个连通块的大小都大于等于2,并且连通块的点数和等于k. 题目分析: 要想留下的边数最少,就要尽量多的选择单独的边,这里就要贪心:尽可能多的选择单独的 ...
- 在WSL中安装和运行Docker CE
安装环境 Windows 10 64bit 专业版 1809 WSL安装ubuntu 18.04 LTS DOCKER安装 安装过程没有什么问题,安装docker的网站说明进行安装https://do ...
- javascript 中英文字符长度和截断处理
因:javascript中的String类自带的length属性 和 substr()方法虽然能判断和截取出字符个数,但是对字节个数却没有处理的方法(众所周知,中文字符占两个字节,英文只占一个) 果: ...
- exponential family distribution(指数族分布)
1. exponential family 给定参数 η,关于 x 的指数族分布定义为如下的形式: p(x∣∣η)=h(x)g(η)exp{ηTu(x)} 其中 x 可以为标量也可以为矢量,可以为离散 ...
- .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
原文 .NET/C# 使窗口永不激活(No Activate 永不获得焦点) 有些窗口天生就是为了辅助其它程序而使用的,典型的如“输入法窗口”.这些窗口不希望抢夺其它窗口的焦点. 有 Win32 方法 ...
- Win10局域网内无法共享的解决方法分享(开启Server和ComputerBrowser服务,其它文章也不错)
局域网共享是办公环境下经常使用的,而有些用户反应在升级到win10系统后,网络总是无法共享,给用户带来了很大的困扰,如果你也遇上这样的情况,并通过一些方法无较后,不妨尝试下小编提供的方法. 如果在Wi ...
- wpf 判断鼠标在一段时间内是否移动
原文:wpf 判断鼠标在一段时间内是否移动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/config_man/article/details/74 ...
- otrs离线部署
OTRS5离线部署 参考地址:https://doc.otrs.org.cn/doc/manual/admin/stable/zh_CN/html/manual-installation-of-otr ...