方法: 現在の選択項目を表示および制限する
ドメイン固有の言語のコマンドまたはジェスチャ ハンドラーを記述するときには要素をユーザーが右クリックしたかを判断できます。 また図形またはフィールドが選択されていることを防ぐことができます。 たとえばユーザーがデコレータ アイコンをクリックするとを含む図形が選択されていることを配置できます。 選択を抑制すると次のように記述するハンドラーの数は少なくなります。 これによりシェイプにデコレータを妨げることはの任意の場所をクリックできるユーザーを簡単にします。
コマンド ハンドラーから現在の選択をアクセス
ドメイン固有言語のコマンド セットのクラスはカスタム コマンドのコマンド ハンドラーが含まれています。 ドメイン固有の言語のコマンド セットのクラスの派生元のクラス CommandSet は現在の選択範囲にアクセスするにはいくつかのメンバーを提供します。
コマンドによってデザイナー コマンド ハンドラーはモデルモデル エクスプローラーまたはアクティブ ウィンドウでを選択する必要があります。
選択の情報にアクセスするには
CommandSet のクラスは現在の選択範囲にアクセスするために使用できる次のメンバーが定義されます。
メンバー
Description
モデル デザイナーで選択されている要素が図形のコンパートメント場合はを返します true ; それ以外 false。
IsDiagramSelected メソッド
図にモデル デザイナーで選択されている場合はを返します true ; それ以外 false。
1 ビットの要素がモデル デザイナーで選択されている場合はを返します true ; それ以外 false。
IsSingleSelection メソッド
1 ビットの要素がアクティブ ウィンドウで選択されている場合はを返します true ; それ以外 false。
CurrentDocumentSelection プロパティ
モデル デザイナーで選択されている要素の読み取り専用コレクションを取得します。
CurrentSelection プロパティ
アクティブ ウィンドウで選択されている要素の読み取り専用コレクションを取得します。
SingleDocumentSelection プロパティ
モデル デザイナーの主要な要素を取得します。
SingleSelection プロパティ
アクティブなウィンドウの主要な要素を取得します。
CommandSet クラスの CurrentDocView のプロパティはモデル デザイナー ウィンドウを表し追加のアクセスをモデル デザイナーで選択した要素 DiagramDocView 提供するオブジェクトへのアクセスを提供します。
また生成されたコードはドメイン固有言語のコマンド セット クラスのエクスプローラーのツール ウィンドウのプロパティおよびエクスプローラーの選択プロパティを定義します。
エクスプローラーのツール ウィンドウのプロパティはドメイン固有の言語のエクスプローラーのツール ウィンドウ クラスのインスタンスを返します。 エクスプローラーのツール ウィンドウ クラスは ModelExplorerToolWindow のクラスから派生しドメイン固有言語 (DSL) モデル エクスプローラーを表します。
[ExplorerSelection] のプロパティはドメイン固有言語 (DSL) モデル エクスプローラー] ウィンドウで選択した要素を返します。
どのウィンドウがアクティブであるかを判断します
IMonitorSelectionService のインターフェイスを定義するシェルの現在の選択状態へのアクセスを提供するメンバーが含まれます。 ドメイン固有の言語のパッケージのコマンド セットのクラスからそれぞれの基本クラスで定義されて [MonitorSelection] のプロパティを使用して IMonitorSelectionService のオブジェクトを取得できます。 パッケージ クラスは ModelingPackage のクラスから派生しコマンド セットの CommandSet クラスはから派生します。
どのようなウィンドウがアクティブであるかコマンド ハンドラーから判断します。
CommandSet クラスの MonitorSelection のプロパティはシェルの現在の選択状態へのアクセスを提供する IMonitorSelectionService のオブジェクトを返します。
IMonitorSelectionService のインターフェイス CurrentSelectionContainer のプロパティがアクティブ ウィンドウとは異なりますアクティブな選択コンテナーを取得します。
どのようなウィンドウがアクティブであるかを判断するためにのコマンド セットのクラスに次のプロパティはドメイン固有言語追加します。
// using Microsoft.VisualStudio.Modeling.Shell; // Returns true if the model designer is the active selection container; // otherwise, false. protected bool IsDesignerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is DiagramDocView); } } // Returns true if the model explorer is the active selection container; // otherwise, false. protected bool IsExplorerActive { get { return (this.MonitorSelection.CurrentSelectionContainer is ModelExplorerToolWindow); } }
選択した制約
選択規則を追加してユーザーがモデル要素を選択すると要素が選択されるかを制御できます。 たとえばユーザーが一つの単位としていくつかの要素を処理できるように選択規則を使用できます。
選択規則を作成するには
DSL のプロジェクトのカスタム コード ファイルを作成します。
DiagramSelectionRules のクラスから派生した選択規則を定義します。
選択基準を適用することも GetCompliantSelection の規則クラスのメソッドをオーバーライドします。
カスタム コード ファイルに [ClassDiagram] のクラスの部分クラス定義を追加します。
[ClassDiagram] のクラスは Diagram のクラスから派生し生成されたコード ファイルDSL のプロジェクトの Diagram.cs で定義されています。
カスタム規則を返すように選択 [ClassDiagram] クラスの SelectionRules のプロパティをオーバーライドします。
SelectionRules のプロパティの既定の実装は選択を変更しない選択規則のオブジェクトを取得します。
例
次のコード ファイルが最初に選択したドメインの図形のすべてのインスタンスを使用するように選択選択を配置する規則を作成します。
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
namespace CompanyName.ProductName.GroupingDsl
{
public class CustomSelectionRules : DiagramSelectionRules
{
protected Diagram diagram;
protected IElementDirectory elementDirectory;
public CustomSelectionRules(Diagram diagram)
{
if (diagram == null) throw new ArgumentNullException();
this.diagram = diagram;
this.elementDirectory = diagram.Store.ElementDirectory;
}
/// <summary>Called by the design surface to allow selection filtering.
/// </summary>
/// <param name="currentSelection">[in] The current selection before any
/// ShapeElements are added or removed.</param>
/// <param name="proposedItemsToAdd">[in/out] The proposed DiagramItems to
/// be added to the selection.</param>
/// <param name="proposedItemsToRemove">[in/out] The proposed DiagramItems
/// to be removed from the selection.</param>
/// <param name="primaryItem">[in/out] The proposed DiagramItem to become
/// the primary DiagramItem of the selection. A null value signifies that
/// the last DiagramItem in the resultant selection should be assumed as
/// the primary DiagramItem.</param>
/// <returns>true if some or all of the selection was accepted; false if
/// the entire selection proposal was rejected. If false, appropriate
/// feedback will be given to the user to indicate that the selection was
/// rejected.</returns>
public override bool GetCompliantSelection(
SelectedShapesCollection currentSelection,
DiagramItemCollection proposedItemsToAdd,
DiagramItemCollection proposedItemsToRemove,
DiagramItem primaryItem)
{
if (currentSelection.Count == 0 && proposedItemsToAdd.Count == 0) return true;
HashSet<DomainClassInfo> itemsToAdd = new HashSet<DomainClassInfo>();
foreach (DiagramItem item in proposedItemsToAdd)
{
if (item.Shape != null)
itemsToAdd.Add(item.Shape.GetDomainClass());
}
proposedItemsToAdd.Clear();
foreach (DomainClassInfo classInfo in itemsToAdd)
{
foreach (ModelElement element
in this.elementDirectory.FindElements(classInfo, false))
{
if (element is ShapeElement)
{
proposedItemsToAdd.Add(
new DiagramItem((ShapeElement)element));
}
}
}
return true;
}
}
public partial class ClassDiagram
{
protected CustomSelectionRules customSelectionRules = null;
protected bool multipleSelectionMode = true;
public override DiagramSelectionRules SelectionRules
{
get
{
if (multipleSelectionMode)
{
if (customSelectionRules == null)
{
customSelectionRules = new CustomSelectionRules(this);
}
return customSelectionRules;
}
else
{
return base.SelectionRules;
}
}
}
}
}