2015-01-04 12 views
5

Windows Phone 8.1アプリケーションには、3つの異なる色の状態を持つことができるコンポーネントがいくつかあるページがあります。赤、青、または現在のテーマの前景色のいずれかにする必要があります。Windows Phone 8.1のテーマの変更をプログラムでチェックするタイミング

したがって、電話でDarkテーマを使用してアプリを起動してから、ユーザーがアプリから離れてLightテーマを変更して再びアプリに入ると、古いテーマの前景色。

コンポーネントは異なる色(テーマの前景色がそのうちの1つ)の間で変更されるはずなので、私は前景をPhoneForegroundColorXAMLに設定できません。私がやった何

はこの行いResumingイベントリスナーを追加することです:

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

しかし... Resumingイベントが更新されApplication.Currentのリソースの前に解雇されたが、私は終わりますこれまでと同じ色で。ユーザーが前回に復帰した場合は、Application.Current.Resources["PhoneForegroundColor"]が、前回のResumingイベントの後のある時点で更新されてから動作します。

質問:Resumingが正しい場所ではないようですので、私は最初、更新Application.Current.Resources["PhoneForegroundColor"]を読むことができますか?

質問:また、私は電話のテーマへの変更を気にすることなく、レッド/ブルー/継承の間でプログラム的にmyTextBlock.Foregroundを変更することができるように、別のコンポーネントのForegroundColor(CSSっぽい)を継承するmyTextBlockための方法があります私のアプリのライフサイクルの中で?

ご了承ください。あなたの最初の質問については

答えて

2

「再開プロセスは」正式に文書化されたが、私は次のことを考え出していません。

再開は、UIスレッドで呼び出されます。 voidを返すメソッドであるため、呼び出し側は内部を待っている間だけ続行します。何かをUIスレッドにマーシャリングすると、それはディスパッチャキューに入れられ、そのために現在のタスクの後に実行されます(再開)。

ので(^^そして、それは動作します)私はこれを作った:あなたのapp.xamlで "ValueProvider" を導入する可能性、のために登録する:あなたの2番目の質問については

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()); 
} 

resumeイベントを返し、現在の色で依存関係プロパティを提供するだけです。

これを使用する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)); 
} 

アプリケーション。XAML:

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

MainPage.xamlを:

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

ありがとうございました!私はまた、最初の解決策を持っていますので、私はその解決策を考えています:)しかし、代わりの解決策として、 "{TextColor、Source = {StaticResource ColorBindingProvider}}"というバインドをプログラムで設定する必要があります。私はRedまたはBlueで上書きしている可能性があるので、XAMLにあったものはもうアクティブではありません... – andrrs

+0

いいえ、単にあなたのColor設定をプロバイダの "App_Resuming"メソッドに入れることができます。これは依存関係プロパティなので、更新時にすべてのバインディングに通知します。実行時に色の設定を変更すると、何とかそれを起動する必要があります。メッセージングを使用するか、App.Current.Resources [...]を介してプロバイダを取得し、プロパティを設定します。 –

+0

Btw:依存プロパティを使用する代わりに、BindingProviderにINotifyPropertyChangedを実装させることもできます。 –

1

のWindows Phone 8.1ではあなたが列挙Windows.UI.Xaml.ApplicationThemeの値を返しますApplication.Current.RequestedTheme魔女を経由して、選択したテーマを決定することができます。

例:

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

詳細と選択したテーマに変更することができます:App_Resumingにhttps://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme

0

登録このため、私のために動作しませんでしたアプリケーションが中断されていない場合、イベントは発生しません。私は、このソリューションでTask.DelayためWindow.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;

不要に耳を傾けなければなりませんでした。

関連する問題