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退出效果 ...
随机推荐
- js进阶 9-16 如何实现多选框全选和取消
js进阶 9-16 如何实现多选框全选和取消 一.总结 一句话总结:选择取到每一个checkbox的值,然后赋值为true或者false就好. 1.如何实现多选框全选和取消? 选择取到每一个check ...
- 简洁常用权限系统的设计与实现(六):不维护节点的深度level,手动计算level,构造树 (把一颗无序的树,变成有序的)
本篇介绍的方法,参考了网上的代码.在递归过程中,计算level,是受到了这种方法的启发. CSDN上有篇关于树的算法,目标是把一个无序的树,变成有序的. 我看了下代码,并运行了下,感觉是可行的. 我 ...
- Asp.net压缩网站中的文件
为了说明自定义虚拟路径,这里弄个示例,仅仅用一个压缩包存放一个网站的多个文件. 这个东西是要需要通过实现3个抽象类来实现: System.Web.Hosting.VirtualPathProvider ...
- 如何解决-bash: jstack: command not found,Linux安装jstack
不少朋友在刚接触jvm的时候,通常在Linux中经常要使用jstack命令,新手经常会遇到如下问题: -bash: jstack: command not found 不用慌张,该命令位于Java/b ...
- No_Sql总结
NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是对不同于传统的关系型数据库的数据库管理系统的统称.在现代的计算系统上每天网络上都 ...
- ASP.NET中前台如何调用后台变量
.Asp.Net中几种相似的标记符号: < %=...%>< %#... %>< % %>< %@ %>解释及用法 答: < %#... %> ...
- Linux下Qt5.6 Fcitx无法输入中文输入解决办法
Qt5.6的解决办法和之前的版本有点不同,方法如下:首先安装 fcitx-frontend-qt5.然后执行: 123 sudo cp /usr/lib/x86_64-linux-gnu/qt5/pl ...
- sdk manager 打不开
解决方法1: 提示 [SDK Manager] Failed to convert path to a short DOS path: C:\windows\system32\java.exe 打开t ...
- Valid page threshold based garbage collection for solid state drive
A method for garbage collection in a solid state drive (SSD) includes determining whether the SSD is ...
- 三星260亿美元的豪赌:想垄断DRAM和NAND闪存市场(规模经济让对手难以招架)
腾讯科技讯 据外媒报道,经过50年的发展,半导体市场仍然显得非常活跃,它在今年有望增长20%.随着高增长而来的是供应短缺,这就是DRAM和闪存价格为什么今年会上涨的原因. 三星在DRAM和闪存市场占有 ...