开发WP8.1的小伙伴们如果选择了WinRT的runtime,可能会被坑:如果你的手机主题是黑色的,但是你的应用选择了白色主题,就像这样

RequestedTheme="Light"

那你会发现,虽然你在写UI配色方面偷懒了许多,但是WP的系统状态栏(显示信号、时间的地方),也就是Silverlight Runtime里称作SystemTray的,配色并不会因为你选择了“Light”而变成黑色这种对比色,它始终是跟着手机系统设置走的(黑色主题则为白色,白色主题则为黑色),于是你的应用就会出现一条白色的状态栏在手机顶端,用户再也不能愉快的看时间了。草草草草草。

当你想修这个问题的时候,你又会发现微软已经把Silverlight时代在xaml里能直接声明的SystemTray给撸掉了,草草草草草。所以我们需要手工去写代码。

这个东西现在叫做StatusBar,需要引用这个命名空间

using Windows.UI.ViewManagement;

使用起来最直接的代码如下,你可以放在首页构造函数最后,这样打开页面就直接有了,并且这个状态栏不会随着页面导航消失,所以随后的页面都不需要重复去做。

StatusBar statusBar = StatusBar.GetForCurrentView();
statusBar.BackgroundColor = Colors.CadetBlue; // 背景色
statusBar.ForegroundColor = Colors.White; // 前景色
statusBar.BackgroundOpacity = 1; // 透明度
statusBar.ProgressIndicator.Text = "FontAwesome Offline Reference (v4.2.0)"; // 文本
statusBar.ProgressIndicator.ShowAsync();

有两个要注意的地方。

1. ShowAsync是个Task async方法,所以是可以被await的,看需要的时候使用

2. 你会发现这样做出来的状态栏上面会有···在动,草草草草:

解决方法是设置进度值为0:

statusBar.ProgressIndicator.ProgressValue = 0;

最终你可以封成一个助手方法,以便日后使用:

public static async Task ShowSystemTrayAsync(Color backgroundColor, Color foregroundColor,
    double opacity = 1, string text = "", bool isIndeterminate = false)
{
    StatusBar statusBar = StatusBar.GetForCurrentView();
    statusBar.BackgroundColor = backgroundColor;
    statusBar.ForegroundColor = foregroundColor;
    statusBar.BackgroundOpacity = opacity;

    statusBar.ProgressIndicator.Text = text;
    if (!isIndeterminate)
    {
        statusBar.ProgressIndicator.ProgressValue = 0;
    }
    await statusBar.ProgressIndicator.ShowAsync();
}

现在,在首页构造函数最下面你就可以:

Snippet

UIHelper.ShowSystemTrayAsync(Colors.CadetBlue, Colors.White, text: "FontAwesome Offline Reference (v4.2.0)");

 

因为构造函数里不能await,所以不要在意这些细节,最终结果是可以用的。