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]エラーが発生する人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。