Version: 2020.3
言語: 日本語
レイアウトイベント
Input イベント

フォーカスイベント

フォーカスイベントは、要素がフォーカスを得たり失ったりするときに発生します。

フォーカスイベントは、ビジュアル要素にフォーカスを当てたり外したりする必要がある場合に便利です。コントロールはフォーカスイベントを利用して、フォーカスの状態に応じてコンテンツを変更することがよくあります。例えば、フォーカスがないときにテキストフィールドにプレースホルダーテキストを表示したり、FocusInEvent に反応してプレースホルダーテキストを消去したりすることができます。

フォーカスは、タブやクリックなどのユーザーインタラクションや、element.Focus() を使った C# スクリプトによって、ビジュアル要素上で変更することができます。

フォーカスイベントは、2 つの異なるタイプに分かれます。

  • FocusOutEventFocusInEvent はフォーカスの変更が発生する直前に、伝播経路に沿って送信されます。
  • FocusEventBlurEvent はフォーカスの変更が発生した直後に、イベントのターゲットに送信されます。

すべてのフォーカスイベントの基本クラスは FocusEventBase です。

イベント 説明 トリクルダウン (下降) 伝播 バブルアップ (上昇) 伝播 キャンセル可能
FocusOutEvent 要素がフォーカスを失う前に送信されます。
FocusInEvent 要素がフォーカスを得る前に送信されます。
BlurEvent 要素がフォーカスを失った後に送信されます。
FocusEvent 要素がフォーカスを得た後に送信されます。

固有のプロパティ

ここでは、フォーカスイベントに特有の関連プロパティについて説明します。これは、フォーカスイベントファミリーのすべてのプロパティの完全なリストではありません。完全なリストは、スクリプトリファレンスの FocusEventBase を参照してください。

relatedTarget: イベントの主要でないターゲットとなるビジュアル要素が含まれます。FocusOutBlur イベントの場合、フォーカスを得る要素が含まれます。FocusInFocus イベントの場合、フォーカスを失う要素が含まれます。

イベント target relatedTarget
Blur フォーカスを失う要素。 フォーカスを得る要素。
Focus フォーカスを得る要素。 フォーカスを失う要素。
focusIn フォーカスを得る要素。 フォーカスを失う要素。
focusOut フォーカスを失う要素。 フォーカスを得る要素。

イベントリスト

FocusOutEvent

FocusOutEvent は、要素がフォーカスを失おうとしているときに送信されます。

target: フォーカスを失う要素。

relatedTarget: フォーカスを得る要素。

FocusInEvent

FocusInEvent は、要素がフォーカスを得ようとしているときに送信されます。

target: フォーカスを得る要素。

relatedTarget: フォーカスを失う要素。

BlurEvent

要素がフォーカスを失った後に送られるイベント。

target: フォーカスを失った要素。

relatedTarget: フォーカスを得た要素。

FocusEvent

要素がフォーカスを得た後に送られるイベント。

target: フォーカスを得た要素。

relatedTarget: フォーカスを失った要素。

以下の例は、TextField (テキストフィールド) でプレースホルダーテキストを使用する方法を示しています。

UXML で要素を作成した後、スクリプトはテキストフィールドにプレースホルダーテキストを割り当てます。テキストフィールドがフォーカスされると、FocusInEvent が発生し、プレースホルダーテキストが消去されます。FocusOutEvent は、TextField のコンテンツに基づいてプレースホルダーモードを切り替えます。

この例の動作を実際に見るには、以下を行います。

  1. PlaceHolderExampleという名前の新しい C# スクリプトを作成します。
  2. サンプルコードを C# スクリプトにコピーします。
  3. Window > UI Toolkit > PlaceHolderExample で、新しくエディターウィンドウを開きます。
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class PlaceHolderExample : EditorWindow
{
    [MenuItem("Window/UI Toolkit/PlaceHolderExample")]
    public static void ShowExample()
    {
        PlaceHolderExample wnd = GetWindow<PlaceHolderExample>();
        wnd.titleContent = new GUIContent("PlaceHolderExample");
    }

    private bool placeHolderMode = true;
    private const string placeHolderText = "Write here";

    public void CreateGUI()
    {
        TextField textField = new TextField();
        textField.value = placeHolderText;
        rootVisualElement.Add(textField);

        textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
        textField.RegisterCallback<FocusOutEvent>(OnFocusOutTextField);
    }

    private void OnFocusInTextField(FocusInEvent evt)
    {
        // テキストフィールドがフォーカスされたばかりで、ユーザーが内部にテキストを書き込んだり編集したりする可能性がある場合は、
        // プレースホルダーテキストをクリアする必要があります (アクティブな場合は)
        if (placeHolderMode)
        {
            var textField = evt.target as TextField;
            textField.value = "";
        }
    }

    private void OnFocusOutTextField(FocusOutEvent evt)
    {
        // ユーザーが編集を終えて要素がフォーカスを失った後にテキストフィールドが空の場合は、
        // プレースホルダーテキストをテキストフィールドに書き込みます
        var textField = evt.target as TextField;
        placeHolderMode = string.IsNullOrEmpty(textField.value);
        if (placeHolderMode)
            textField.value = placeHolderText;
    }
}
レイアウトイベント
Input イベント