UIElements には以下の標準コントロールが組み込まれています。
コンテキストメニューコントロールは、コンテキストに応じて一揃いの選択肢やアクションを表示する標準的なコントロールです。通常、このコンテキストは現在選択されているものですが、コンテキストは何でも構いません。
ここでは、コンテキストメニューを追加する方法を示し、コールバックを説明し、ユーザーの選択に応答する方法を説明します。
コンテキストメニューを表示するには、コンテキストメニューを発生させるイベントのコールバックで ContextualMenuManager.DisplayMenu()
を呼び出します。
例えば、マウスの右ボタンを離したときにコンテキストメニューを表示するには、OnMouseUpEvent
のコールバックに以下のコードを追加します。
// VisualElement サブクラスで
void OnMouseUpEvent(MouseUpEvent evt)
{
if (elementPanel == null || elementPanel.contextualMenuManager == null)
return;
if (evt.button != MouseButton.RightMouse || evt.modifiers != EventModifiers.None)
return;
elementPanel.contextualMenuManager.DisplayMenu(evt, this);
evt.StopPropagation();
evt.PreventDefault();
}
上の例では、ContextualMenuManager.DisplayMenu()
は DisplayMenu()
の 2 番目の引数として ContextualMenuPopulateEvent
イベントターゲットを送信します。このイベントは、ビジュアルツリーのルートから伝播経路に沿ってビジュアル要素ツリーに伝播されます。ビジュアルツリーのルートからイベントターゲットまで、次に、ビジュアルツリーをルートへと上昇します。伝播経路に沿って、ContextualMenuPopulateEvent
イベントのコールバックを持つ要素は、コンテキストメニューの項目を追加、削除、変更することができます。
上の例は、StopPropagation
の使い方と PreventDefault()
で要素が表示されないようにする方法も示しています。
コンテキストメニューを追加するには、ContextualMenuManipulator
をビジュアル要素にアタッチします。このマニピュレーターは、右ボタンの Mouse Up イベントかメニューの Key Up イベントのいずれかの後にコンテキストメニューを表示するコールバックを加えます。ContextualMenuManipulator
マニピュレーターは ContextualMenuPopulateEvent
に応答するコールバックも追加します。
このインストールされたコールバックはまた、デリゲートを呼び出してコンテキストメニューを生成します。デリゲートは、マニピュレーターをインスタンス化するときに必要です。次のコード例は、これを行う方法を示しています。
void InstallManipulator(VisualElement element)
{
ContextualMenuManipulator m = new ContextualMenuManipulator(MyDelegate);
m.target = element;
}
void MyDelegate(ContextualMenuPopulateEvent event)
{
// event.menu を変更
event.menu.AppendAction("Properties", DisplayProperties, DropdownMenu.MenuAction.AlwaysEnabled);
}
void DisplayProperties(DropdownMenu.MenuAction menuItem)
{
// ...
}
要素が ContextualMenuPopulateEvent
を受け取ると、DropdownMenu.InsertAction()
か DropdownMenu.AppendAction()
のいずれかを呼び出すことによって、メニュー項目をコンテキストメニューに加えます。
これらの関数はそれぞれ、パラメーターとして 2 つのコールバックをとります。最初のコールバックは、ユーザーがメニューの項目を選択したときに実行されます。2 番目のコールバックは、メニューを表示する前に実行されます。また、2 番目のコールバックはメニュー項目が有効かどうかをチェックします。
それらのコールバックは両方とも MenuAction
をパラメーターとして受け取ります。MenuAction
はメニュー項目を表し、以下のような便利なプロパティを持ちます。
MenuAction.userData
には、AppendAction()
や InsertAction()
によって使用された可能性のあるユーザーデータへの参照が含まれます。MenuAction.eventInfo
には、コンテキストメニューの表示をトリガーしたイベントに関する情報が含まれます。イベントへ応答するアクションの MenuAction.eventInfo
を使用してください。例えば、マウスの位置を使用して、選択したコンテキストメニュー項目に基づいて、オブジェクトを作成し配置することができます。