何时在Windows Phone 8.1中以编程方式检查主题更改

本文关键字:检查 方式 编程 Windows Phone 何时 | 更新日期: 2023-09-27 18:36:04

我在Windows Phone 8.1应用程序中有一个页面,其中有一些组件应该能够具有三种不同的颜色状态。它们应该是红色、蓝色或当前主题的前景色。

因此,如果我的应用程序在手机上开始使用深色主题,然后用户退出应用程序并更改浅色主题,然后再次进入我的应用,我需要立即更改具有旧主题前景色的组件。

由于组件应该在不同的颜色之间变化(主题的前景颜色只是其中之一(,我无法在XAML中将其前景设置为PhoneForegroundColor

我所做的是添加一个Resuming事件侦听器来执行以下操作:

myTextBlock.Foreground = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]);

但是。。。CCD_ 4事件在Application的资源之前被激发。当前已更新,所以我最终使用与以前相同的颜色。如果用户一次又一次地退出,它将工作,因为Application.Current.Resources["PhoneForegroundColor"]是在上次Resuming事件之后的某个时间点更新的。

问题:由于Resuming似乎不是正确的位置,我什么时候可以第一次阅读更新的Application.Current.Resources["PhoneForegroundColor"]

问题:或者,myTextBlock有没有办法继承另一个组件的ForegroundColor(CSS ish(,这样我就可以在红/蓝/继承之间用程序更改myTextBlock.Foreground,而不必介意在应用程序的生命周期内更改手机主题?

欢迎提出任何建议!

何时在Windows Phone 8.1中以编程方式检查主题更改

关于你的第一个问题:"简历流程"没有正式记录,但我发现了以下内容:

在UI线程上调用Resume。由于它是一个void返回方法,所以当它内部有一个等待时,调用者将继续。如果将某个东西编组到UI线程中,它将在调度器队列中,因此在当前任务之后运行(继续(。

所以我刚刚做了这个(它很有效^^(:

private async void App_Resuming(object sender, object e)
{
    var x1 = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]);
    Debug.WriteLine(x1?.Color.ToString());
    // Await marshalls back to the ui thread,
    // so it gets put into the dispatcher queue
    // and is run after the resuming has finished.
    await Task.Delay(1);
    var x2 = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]);
    Debug.WriteLine(x2?.Color.ToString());
}

关于您的第二个问题:您可以在app.xaml中引入一个"ValueProvider",它注册恢复事件,并只提供当前颜色的依赖属性。

您仍然需要在任何想要在中使用它的TextBlock上设置它,但至少要直接在XAML中设置它。这可能也适用于样式,但没有尝试。

示例实施。。。。

提供商:

public class ColorBindingProvider : DependencyObject
{
    public ColorBindingProvider()
    {
        App.Current.Resuming += App_Resuming;
    }
    private async void App_Resuming(object sender, object e)
    {
        // Delay 1ms (see answer to your first question)
        await Task.Delay(1);
        TextColor = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]);
    }
    public Brush TextColor
    {
        get { return (Brush)GetValue(TextColorProperty); }
        set { SetValue(TextColorProperty, value); }
    }
    public static readonly DependencyProperty TextColorProperty =
        DependencyProperty.Register("TextColor", typeof(Brush), typeof(ColorBindingProvider), new PropertyMetadata(null));
}

App.xaml:

<Application.Resources>
    <local:ColorBindingProvider x:Name="ColorBindingProvider" TextColor="{StaticResource PhoneForegroundBrush}" />
</Application.Resources>

主页.xaml:

<TextBlock Text="Hey ho let's go" Foreground="{Binding TextColor, Source={StaticResource ColorBindingProvider}}" />

在Windows Phone 8.1中,您可以通过Application.Current.RequestedTheme确定所选主题,开关将返回枚举Windows.UI.Xaml.ApplicationTheme的值。

示例:

public static string GetImagePath(){
    // if the background color is black, i want a white image
    if(Application.Current.RequestedTheme == ApplicationTheme.Dark)
        return "ms-appx:///Assets/img_light.jpg";
    // if the background color is white, i want a dark image
    return "ms-appx:///Assets/img_dark.jpg";
}

附带说明:您甚至可以使用Application.Current.RequestedTheme 更改所选主题

更多详细信息:https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme

注册到App_Resuming对我来说不起作用,因为在应用程序未挂起时不会引发此事件。我不得不听Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;

此解决方案不需要Task.Delay