バージョン

Drag and Drop Framework を使った作業

このトピックでは、NetworkNode および Drag and Drop Framework を使ったドラッグ アンド ドロップの実装方法を説明します。

トピックは以下のとおりです。

概要

ドラッグ アンド ドロップを実装している場合、階層の基本データは手動で更新する必要があります。これは xamNetworkNode コントロールの必要条件であるため、変更を反映することがあります。

プレビュー

以下は、ネットワーク構造を再編成する、ドラッグされているノードのプレビューです。

xamNetworkNode Drag and Drop 01.png

図 1: ノードのドラッグ

要件

必要な NuGet パッケージの参照:

  • Infragistics.WPF.NetworkNode

NuGet フィードのセットアップと NuGet パッケージの追加の詳細については、NuGet フィード ドキュメントを参照してください。

手順

  1. 名前空間宣言を追加します。

    1. XML 名前空間宣言を XAML ファイルに追加します:

XAML の場合:

xmlns:ig="http://schemas.infragistics.com/xaml"
  1. コード ビハインドに using/imports を配置します。

Visual Basic の場合:

Imports Infragistics.Controls.Maps
Imports Infragistics.DragDrop

C# の場合:

using Infragistics.Controls.Maps;
using Infragistics.DragDrop;
  1. 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);
  1. ノード ドラッグ ソースドロップ ターゲットを作成します。

ノードで作業するため、xamNetworkNode コントロールは 2 つのキー クラスを使用します:

  • NetworkNodeNode - そのオブジェクトは実際の Network ノードです。このクラスは、親ノードと子ノード、ノードが表示するデータ、ノードの作成のために使用される NetworkNodeNodeLayout オブジェクトへの参照に関する情報を持っています。

  • NetworkNodeNodeControl - そのオブジェクトは NetworkNodeNode オブジェクトのビジュアル表現として機能します。

そのため、Drag Sources および Drop Targets は NetworkNodeNodeControl オブジェクトです。

ノードがパンニングのために NetworkNode の可視領域から出るときは常に、そのノードに関連する NetworkNodeNodeControl が破棄されます。また、ノードの子が折り畳まれるときは、その NetworkNodeNodeControls が破棄されます。

ノードを表示する必要がある場合、そのノードに関連する新しい NetworkNodeNodeControl が作成され、 NodeControlAttachedEvent が発生します。

Drag and Drop Framework で作業をする場合、その作成時に DragSource および DropTarget プロパティを NetworkNodeNodeControl オブジェクトに添付する必要があります。

Note

注: 場合によっては、ドラッグされるノードのドロップ ターゲットに制限があります (社員だけを部署にドロップできるなど)。このビヘイビアーは、Drag and Drop Framework のドラッグ アンド ドロップ チャネルを使用して達成できます。

  1. NodeControlAttachedEvent にイベント ハンドラーを指定します。

XAML の場合:

<ig:XamNetworkNode    NodeControlAttachedEvent="NetworkNode_NodeControlAttachedEvent">
</ig:XamNetworkNode>
  1. 新しい 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);
}
  1. ドラッグ ソースの 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: 基となるデータを修正します
}

== 関連トピック