在 Win 10 Mobile 上返回屏幕尺寸的 Splashscreen Rect 坐标

Posted

技术标签:

【中文标题】在 Win 10 Mobile 上返回屏幕尺寸的 Splashscreen Rect 坐标【英文标题】:Splashscreen Rect coordinates returning Screen dimensions on Win 10 Mobile 【发布时间】:2015-12-17 07:47:11 【问题描述】:

我正在尝试在需要 SplashScreen 图像坐标的 UWP 应用上创建扩展 SplashScreen。我在 App.xaml.cs 中使用以下代码:

 protected override void OnLaunched(LaunchActivatedEventArgs e)
        
            if (e.SplashScreen != null)
                var SplashLocation = e.SplashScreen.ImageLocation;
            //Rest of initialization...
        

但是,如果我检查 SplashLocation 这是一个 RectSplashLocation.HeightSplashLocation.Width 返回 1280 和 768,这是我手机屏幕的尺寸。所有其他属性均为 0。

这是 Win 10 Mobile [build 10536] 中的已知错误吗?它在桌面 Windows 10 上运行良好。

【问题讨论】:

闪屏会覆盖整个手机屏幕吗? 没有。我只是用与设置的背景颜色不同的颜色制作了我的 splascreen 来检查它。闪屏显示为居中的图像。 你找到解决办法了吗,我也遇到了同样的问题。 感谢上帝,我没疯!哈哈。是的,我确实找到了一种似乎几乎可以正常工作的解决方法。一会儿我会贴出来。 它对你有用吗@KMan? 【参考方案1】:

作为一种解决方法,这就是我所做的:

Grid 内的 XAML 中创建一个 Image(而不是在 msdn 文档建议的 Canvas 内)

    <Image Name="ExtSplash" 
           Stretch="Uniform" 
           HorizontalAlignment="Center"  
           VerticalAlignment="Center" 
           Source="Assets/Splash/SplashScreen.png"/>

现在,诀窍是让它在移动设备(不能提供正确的Rect 坐标和桌面(按预期工作)上工作)

所以,在后面代码中Page的加载事件中,我使用了这个代码:

    if (splash.Top < splash.Left)
        ExtSplash.Margin = new Thickness(splash.Top);
    else
        ExtSplash.Margin = new Thickness(splash.Left);

其中Splash = e.SplashScreen.ImageLocation 来自 App.xaml.cs 中的 OnLaunched 事件。

这是有效的,因为 Splash.TopSplash.Left 在移动的情况下都返回 0。因此,该应用程序只显示完全扩展到宽度的启动画面。在桌面的情况下,图像可能有一些左坐标或上坐标,因为它在桌面上正确报告,我将它们设置为 Margin 用于居中对齐的均匀拉伸图像。

注意 1:在某些情况下,启动画面和 ExtendedSplash 图像之间可能会发生细微的变化。但在我的测试中,它运行良好。即使在以后的版本中 MS 修复了该问题,它也会继续工作,因此您可以花时间实现标准方法。

注意 2:如果提供了 400 比例的初始屏幕图像,我会遇到此逻辑的一些问题。出于某种原因,WM10 获得了可用的最高分辨率。所以我只提供了 100、125、150 和 200 比例的图像(跳过了 400)

【讨论】:

【参考方案2】:

实际上问题在于 MSDN 文档中给出的代码是错误的。在 Github 上查看他们的示例。你可以在这里找到它: Splash Screen Sample

注意 MSDN 文档和示例之间的差异:

    ExtendedSplash 不扩展页面 他们在电话中使用 ScaleFactor XAML 的根元素是 Grid 而不是 page。

我遵循了他们的样本(经过数小时的思考),一切都很好。我希望他们更新他们的文档以反映正确的事情。

【讨论】:

很好的发现。您是否在最新的移动版本上尝试过 MSDN 版本?因为我的解决方法仍然有效,所以我没有在最近的版本上尝试过。如果它仍然不起作用,那么ScaleFactor 一定是原因。我看不出“不从 Page 扩展”会有什么不同。 我在最新版本上试过了,但还是不行。不从 Page 扩展与将 ExtendedSpash 作为内容添加到 RootFrame 一起使用,因此您也可以控制 statusBar 颜色【参考方案3】:

我最终放弃了SplashScreen.ImageLocation 方法。在撰写本文时,Microsoft tutorial 无法在移动设备上运行,而the sample 则很骇人听闻。相反,我对扩展的初始屏幕使用了这样的简单布局:

<Grid>
    <Image x:Name="splashScreenImage" Source="Assets/SplashScreen.png" MaxWidth="620" MaxHeight="300"/>
    <!-- plus some other control -->
</Grid>

神奇的是使用MaxWidth/MaxHeight

在移动设备上,图像在垂直方向上的位置会略有不同(我猜是因为状态栏和导航栏),但在其他方面是正确的,包括大小。在桌面上,图像的位置和大小似乎与初始启动画面完全一致。

【讨论】:

你能发布你的PositionImage()吗? @ravikumar 我不再参与这个项目了,抱歉。

以上是关于在 Win 10 Mobile 上返回屏幕尺寸的 Splashscreen Rect 坐标的主要内容,如果未能解决你的问题,请参考以下文章

Win10 Mobile RS2预览版14915现bug:操作中心遇“难关

获取可用的屏幕尺寸

如何在Mobile View中显示总屏幕上的sideTab?

mobile_缩放

如何获得活动屏幕尺寸?

当Win10 Mobile加上任务栏