single.php

C# WinUI3の[AutoSuggestBox]で矢印キーを入力した際に不定の文字が表示される場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで[AutoSuggestBox]コントロールで候補リストを表示した際にキーボードの矢印キーを押した際に不定の文字が表示される場合の対処法です。

入力したキーワードで候補を表示

[AutoSuggestBox]コントロールは、キーワードから用意した候補リストを表示してユーザーに選択させる表示が可能です。

例えば、こんな感じでテキストボックスに入力した文字に該当する一覧を表示して、ユーザーに選択する機能がアプリに追加できます。

この状態で一覧の選択をマウスカーソルではなく、キーボードの矢印キーを押すと不定な文字がテキストボックスに表示されます。

キーボードで候補リストを選択させる

調べてみると[AutoSuggestBox]コントロールの不具合のような記載がありますが、矢印キーで候補リストを選択すると不定な文字の表示を防止できます。

具体的には次の手順で行います。

1. 矢印キーが入力されている間は、他のイベントをキャンセルするためのフラグを追加します。

private bool IsSuggestSelecting = false;

2. 新しく[ProcessKeyboardAccelerators]イベントを追加して、特定のキーが押された場合にフラグを有効にします。

private void AutoSuggestFindTitle_ProcessKeyboardAccelerators(UIElement sender, ProcessKeyboardAcceleratorEventArgs args)
{
  if (args.Key == VirtualKey.Down || args.Key == VirtualKey.Up)
  {
    IsSuggestSelecting = true;
  }
}

3. テキストが変更された際のイベント[TextChanged]の先頭でフラグを判定して、キー入力中は処理をキャンセルします。

private void AutoSuggestFindTitle_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
  if (IsSuggestSelecting == true)
  {
    return;
  }

  //テキストが変更された場合の処理
}

ここまでの変更で、[AutoSuggestBox]コントロールで表示した候補リストを上と下の矢印キーで移動できるようになります。

4. この状態だとキーワードを編集してもリストが更新されなくなるので[ProcessKeyboardAccelerators]イベントを修正します。

private void AutoSuggestFindTitle_ProcessKeyboardAccelerators(UIElement sender, ProcessKeyboardAcceleratorEventArgs args)
{
  if (args.Key == VirtualKey.Down || args.Key == VirtualKey.Up)
  {
    IsSuggestSelecting = true;
  }

  if (args.Key == VirtualKey.Delete || args.Key == VirtualKey.Back || args.Key == VirtualKey.Enter)
  {
    IsSuggestSelecting = false;
  }
}

[ENTER]キーで候補を選択した場合や、キーワードを削除した場合にフラグを元に戻すことで候補リストが更新されるようになります。

まとめ

今回はWinUI3プロジェクトで[AutoSuggestBox]コントロールで候補リストを表示した際にキーボードの矢印キーを押した際に不定の文字が表示される場合の対処法について紹介しました。

[AutoSuggestBox]コントロールで候補リストを表示している状態で、矢印キーを押すと不定な文字列が表示される場合があります。

この現象は、矢印キーの入力で候補リストを選択可能にすることで回避できます。

WinUI 3で[AutoSuggestBox]コントロールで矢印キーを入力した際に不定な文字列が表示されてしまう人の参考になれば幸いです。

スポンサーリンク

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

コメントを残す

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