ドラッグ アンド ドロップを実装している場合、階層の基本データは手動で更新する必要があります。これは xamOrgChart™ コントロールの要件であるため、xamOrgChart™ コントロールの変更を反映できます。
以下は階層を再整理するためにドラッグされるノードのプレビューです:
図 1: ノードのドラッグ
必要な NuGet パッケージの参照:
Infragistics.WPF.OrgChart
NuGet フィードのセットアップと NuGet パッケージの追加の詳細については、NuGet フィード ドキュメントを参照してください。
名前空間宣言を追加します。
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;
ドロップ ターゲットとして xamOrgChart を構成します。
XAML の場合:
<ig:XamOrgChart>
<ig:DragDropManager.DropTarget>
<ig:DropTarget IsDropTarget="True" />
</ig:DragDropManager.DropTarget>
</ig:XamOrgChart>
Visual Basic の場合:
Dim orgChart As New XamOrgChart()
' 新しい DropTarget オブジェクトを作成します
Dim dropTarget As New DropTarget()
dropTarget.IsDropTarget = True
' 組織図をドロップ ターゲットにします
DragDropManager.SetDropTarget(orgChart, dropTarget)
C# の場合:
XamOrgChart orgChart = new XamOrgChart();
//新しい DropTarget オブジェクトを作成します
DropTarget dropTarget = new DropTarget();
dropTarget.IsDropTarget = true;
//組織図をドロップ ターゲットにします
DragDropManager.SetDropTarget(orgChart, dropTarget);
ノード ドラッグ ソースと ドロップ ターゲットを作成します。
ノードで作業するため、xamOrgChart コントロールは 2 つのキー クラスを使用します:
OrgChartNode - そのオブジェクトは実際の組織図ノードです。このクラスは親および子ノード、ノードによって表示されるデータ、ノードを作成するために使用される OrgChartNodeLayout オブジェクトへの参照に関する情報を伝達します。
OrgChartNodeControl - そのオブジェクトは、OrgChartNode オブジェクトのビジュアル表現として役割を果たします
したがって、ドラッグ ソースおよびドロップ ターゲットは、 OrgChartNodeControl オブジェクトです。
パンニングによって、ノードが組織図の表示可能な領域から外れる時は常に、そのノードに関連した OrgChartNodeControl が破棄されます。また、ノードの子が縮小されると、その OrgChartNodeControls は破棄されます。
ノードを表示する必要がある場合、そのノードに関連付けられた新しい OrgChartNodeControl が作成され、 NodeControlAttachedEvent が発生します。
Drag and Drop Framework で作業する場合、作成時に DragSource および DropTarget プロパティを OrgChartNodeControl オブジェクトに添付する必要があります。
注: 場合によっては、ドラッグされるノードのドロップ ターゲットに制限があります (社員だけを部署にドロップできるなど)。このビヘイビアーは、Drag and Drop Framework のドラッグ アンド ドロップ チャネルを使用して達成できます。
NodeControlAttachedEvent にイベント ハンドラーを指定します。 XAML の場合:
<ig:XamOrgChart
NodeControlAttachedEvent="OrgChart_NodeControlAttachedEvent">
</ig:XamOrgChart>
ドラッグ ソースおよびドロップ ターゲットとして新しい OrgChartNodeControl を構成します。 Visual Basic の場合:
Private Sub OrgChart_NodeControlAttachedEvent(sender As Object, e As OrgChartNodeEventArgs)
' 新しい DragSource オブジェクトを作成します
Dim dragSource As New DragSource()
dragSource.IsDraggable = True
'dragSource.DragChannels = assign drag channels
AddHandler dragSource.Drop, AddressOf 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 OrgChart_NodeControlAttachedEvent(object sender, OrgChartNodeEventArgs 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)
'ドラッグされる OrgChartNodeControl オブジェクトを取得します
Dim draggedNodeControl As OrgChartNodeControl = _
TryCast(e.DragSource, OrgChartNodeControl)
'ドラッグされる OrgChartNode オブジェクトを取得します
Dim draggedNode As OrgChartNode = draggedNodeControl.Node
'基となるデータを取得します
Dim data As Object = draggedNode.Data
'TODO: 基となるデータを修正します
End Sub
C# の場合:
private void Node_Drop(object sender, DropEventArgs e)
{
//ドラッグされる OrgChartNodeControl オブジェクトを取得します
OrgChartNodeControl draggedNodeControl = _
e.DragSource as OrgChartNodeControl;
//ドラッグされる OrgChartNode オブジェクトを取得します
OrgChartNode draggedNode = draggedNodeControl.Node;
//基となるデータを取得します
object data = draggedNode.Data;
//TODO: 基となるデータを修正します
}