ideaki's blog

WinRT C#/XAML の開発について

UWP UISettingsを使用する場合の注意点

投稿時点(2017/01/08)の投稿者のWindows 10 SDKの最新バージョンは14393になります。
この記事はUWPデスクトップアプリ向けです。

UISettingsを使用することで、アクセントカラーの取得や変更通知の受け取りができます。

// using Windows.UI.ViewManagement;
// sender is UISettings
new UISettings().ColorValuesChanged += (sender, e) => Debug.WriteLine(sender.GetColorValue(UIColorType.Accent));

使用する場合はいくつかの注意点があります。

  1. ColorValuesChanged 通知が2度続けてやってくる(500ms前後の間あり)
  2. ColorValuesChanged 通知直後にGetColorValue()すると値が正しくない(1~2秒待機する必要がある)
  3. リリースビルドではUISettingsをAppクラス外でインスタンス化するとコードの実行がスキップされる(?!)

3.の対処は簡単ですAppコンストラクタでUISettingsをインスタンス化してどこかに保持しておけばいいです。
 デバッグビルドではどこでUISettingsをインスタンス化しても問題ない、なぜなのか...
1.も2.もRxを使えばたいしたことないのですが、なぜかリリースビルドでは下記のコードがエラーとなってしまいます。
 #Rxの達人でもなければ今回の対処のために初めて実用したレベルなのであきらめ...

Observable.FromEventPattern(UISettings, "ColorValuesChanged")
    .Throttle(TimeSpan.FromMilliseconds(2000))
    .ObserveOn(SynchronizationContext.Current)
    .Subscribe( _ =>
    {
        // hoge
    });
// ↓リリースビルド実行結果↓
// 例外がスローされました: 'System.InvalidOperationException' (System.Reactive.Linq.dll の中)
// 型 'System.InvalidOperationException' の例外が System.Reactive.Linq.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした
// 追加情報:Could not find event 'ColorValuesChanged' on object of type 'Windows.UI.ViewManagement.UISettings'.

手っ取り早くアクセントカラーの変更監視と取得を行うにはUISettingsしかありません。
できれば使いたくない代物ですが頑張って使うしかないです。