ドラッグ アンド ドロップを実装している場合、階層の基本データは手動で更新する必要があります。これは xamNetworkNode コントロールの必要条件であるため、変更を反映することがあります。
以下は、ネットワーク構造を再編成する、ドラッグされているノードのプレビューです。
図 1: ノードのドラッグ
必要となる参照:
InfragisticsWPF4.v20.1.dll
InfragisticsWPF4.DataVisualization.v20.1.dll
InfragisticsWPF4.Controls.Maps.XamNetworkNode.v20.1.dll
名前空間宣言を追加します。
XML 名前空間宣言を XAML ファイルに追加します:
XAML の場合:
xmlns:ig="http://schemas.infragistics.com/xaml"
コード ビハインドに using/imports を配置します。
Visual Basic の場合:
Imports Infragistics.Controls.Maps Imports Infragistics.DragDrop
C# の場合:
using Infragistics.Controls.Maps; using Infragistics.DragDrop;
Drop Target として xamNetworkNode を構成します。
XAML の場合:
<ig:XamNetworkNode>
<ig:DragDropManager.DropTarget>
<ig:DropTarget IsDropTarget="True" />
</ig:DragDropManager.DropTarget>
</ig:XamNetworkNode>
Visual Basic の場合:
Dim networkNode As New XamNetworkNode() ' 新しい DropTarget オブジェクトを作成します Dim dropTarget As New DropTarget() dropTarget.IsDropTarget = True ' NetworkNode を Drop Target にします。 DragDropManager.SetDropTarget(networkNode, dropTarget)
C# の場合:
XamNetworkNode networkNode = new XamNetworkNode(); //新しい DropTarget オブジェクトを作成します DropTarget dropTarget = new DropTarget(); dropTarget.IsDropTarget = true; // NetworkNode を Drop Target にします。 DragDropManager.SetDropTarget(networkNode, dropTarget);
ノード ドラッグ ソースと ドロップ ターゲットを作成します。
ノードで作業するため、xamNetworkNode コントロールは 2 つのキー クラスを使用します:
NetworkNodeNode - そのオブジェクトは実際の Network ノードです。このクラスは、親ノードと子ノード、ノードが表示するデータ、ノードの作成のために使用される NetworkNodeNodeLayout オブジェクトへの参照に関する情報を持っています。
NetworkNodeNodeControl - そのオブジェクトは NetworkNodeNode オブジェクトのビジュアル表現として機能します。
そのため、Drag Sources および Drop Targets は NetworkNodeNodeControl オブジェクトです。
ノードがパンニングのために NetworkNode の可視領域から出るときは常に、そのノードに関連する NetworkNodeNodeControl が破棄されます。また、ノードの子が折り畳まれるときは、その NetworkNodeNodeControls が破棄されます。
ノードを表示する必要がある場合、そのノードに関連する新しい NetworkNodeNodeControl が作成され、 NodeControlAttachedEvent が発生します。
Drag and Drop Framework で作業をする場合、その作成時に DragSource および DropTarget プロパティを NetworkNodeNodeControl オブジェクトに添付する必要があります。
注: 場合によっては、ドラッグされるノードのドロップ ターゲットに制限があります(社員だけを部署にドロップできるなど)。このビヘイビアーは、Drag and Drop Framework のドラッグ アンド ドロップ チャネルを使用して達成できます。
NodeControlAttachedEvent にイベント ハンドラーを指定します。
XAML の場合:
<ig:XamNetworkNode NodeControlAttachedEvent="NetworkNode_NodeControlAttachedEvent"> </ig:XamNetworkNode>
新しい NetworkNodeNodeControl を Drag Source および Drop Target として構成します。
Visual Basic の場合:
Private Sub NetworkNode_NodeControlAttachedEvent(sender As Object, e As NetworkNodeNodeEventArgs)
' 新しい DragSource オブジェクトを作成します
Dim dragSource As New DragSource()
dragSource.IsDraggable = True 'dragSource.DragChannels = assign drag channels
dragSource.Drop += Node_Drop
' ノードをドラッグ ソースにします
DragDropManager.SetDragSource(e.Node, dragSource)
' 新しい DropTarget オブジェクトを作成します
Dim dropTarget As New DropTarget()
dropTarget.IsDropTarget = True 'dropTarget.DropChannels = assign drop channels
' ノードをドロップ ターゲットにします
DragDropManager.SetDropTarget(e.Node, dropTarget)
End Sub
C# の場合:
private void NetworkNode_NodeControlAttachedEvent(object sender, NetworkNodeNodeEventArgs e)
{
//新しい DragSource オブジェクトを作成します
DragSource dragSource = new DragSource();
dragSource.IsDraggable = true;
//dragSource.DragChannels = assign drag channels
dragSource.Drop += Node_Drop;
//ノードをドラッグ ソースにします
DragDropManager.SetDragSource(e.Node, dragSource);
//新しい DropTarget オブジェクトを作成します
DropTarget dropTarget = new DropTarget();
dropTarget.IsDropTarget = true;
//dropTarget.DropChannels = assign drop channels
//ノードをドロップ ターゲットにします
DragDropManager.SetDropTarget(e.Node, dropTarget);
}
ドラッグ ソースの Drop イベントを処理します。
Visual Basic の場合:
Private Sub Node_Drop(sender As Object, e As DropEventArgs)
' ドラッグされた NetworkNodeNodeControl オブジェクトを取得します。
Dim draggedNodeControl As NetworkNodeNodeControl = TryCast(e.DragSource, NetworkNodeNodeControl)
' ドラッグされた NetworkNodeNode オブジェクトを取得します。
Dim draggedNode As NetworkNodeNode = draggedNodeControl.Node
'基となるデータを取得します
Dim data As Object = draggedNode.Data
'TODO: 基となるデータを修正します
End Sub
C# の場合:
private void Node_Drop(object sender, DropEventArgs e)
{
// ドラッグされた NetworkNodeNodeControl オブジェクトを取得します。
NetworkNodeNodeControl draggedNodeControl = e.DragSource as NetworkNodeNodeControl;
// ドラッグされた NetworkNodeNode オブジェクトを取得します。
NetworkNodeNode draggedNode = draggedNodeControl.Node;
//基となるデータを取得します
object data = draggedNode.Data;
//TODO: 基となるデータを修正します
}