single.php

C# WinUI3[ColorValuesChanged]イベントで[COMException]発生する場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで[アクセントカラー]の変更を検出する[ColorValuesChanged]イベントで[COMException]エラーが発生する場合の対処法です。

アクセントカラーの変更

[個人用設定|色]画面で変更できる[アクセントカラー]。

WinUI3プロジェクトの[SystemAccentColor]などのリソースで色設定をしておけば、ユーザーが選択した[アクセントカラー]が反映されます。

具体的には、こんな感じでアクセントカラーに対応した色設定が取得できます。

Windows.UI.Color systemaccentcolorColor = (Windows.UI.Color)App.Current.Resources["SystemAccentColor"];

しかし、すべて反映される訳では無いようで[StackPanel]の[BackGround]プロパティに設定したアクセントカラーは反映されませんでした。

このような場合、アクセントカラーを反映させるために[個人用設定|色]でユーザーがアクセントカラーを変更した場合に発火する[UiSettings_ColorValuesChanged]イベントが用意されています。

private void UiSettings_ColorValuesChanged(UISettings sender, object args)
{
  Windows.UI.Color accentColor = sender.GetColorValue(UIColorType.Accent);
  SolidColorBrush accentBrush = new SolidColorBrush(accentColor);
}

こんな感じでイベント内でアクセントカラーに関する処理が行えます。

実行すると、[COMException]エラーが発生する場合があります。

[TryEnqueue]メソッドで回避

イベント内で[COMException]エラーが発生する場合には[TryEnqueue]で回避が可能でした。

非同期プロシージャーなどの場合に利用する[TryEnqueue]メソッドですが、具体的には次のようなコードに修正します。

private void UiSettings_ColorValuesChanged(UISettings sender, object args)
{
  Windows.UI.Color accentColor = sender.GetColorValue(UIColorType.Accent);
  this.DispatcherQueue.TryEnqueue(Microsoft.UI.Dispatching.DispatcherQueuePriority.Normal, () => UpdateProgressBackGroundColor(accentColor));
}

private void UpdateProgressBackGroundColor(Windows.UI.Color accentColor)
{
    SolidColorBrush? backgroundBrush = new SolidColorBrush(accentColor);
    if (backgroundBrush != null)
    {
        SampleControl.Background = backgroundBrush;
    }
}

まとめ

今回は短い記事ですが、WinUI3プロジェクトで[アクセントカラー]の変更を検出する[ColorValuesChanged]イベントで[COMException]エラーが発生する場合の方法について紹介しました。

[個人用設定|色]でユーザーがアクセントカラーを変更した場合に発火する[UiSettings_ColorValuesChanged]イベントに、コントロールの背景色などの変更コードを追加した場合に[COMException]エラーが発生する場合があります。

非同期イベントの処理同様に[TryEnqueue]メソッドを利用してエラーの回避が可能でした。

WinUI 3の[ColorValuesChanged]イベントで[COMException]エラーが発生する人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です