次の方法で共有


ドラッグ アンド ドロップの概要

このトピックでは、Windows Presentation Foundation (WPF) アプリケーションでのドラッグ アンド ドロップのサポートの概要について説明します。 ドラッグ アンド ドロップとは、一般的に、マウス (またはその他のポインティング デバイス) を使用して 1 つ以上のオブジェクトを選択し、ユーザー インターフェイス (UI) で目的のドロップ ターゲットの上にこれらのオブジェクトをドラッグしてドロップする方法を指します。

WPF でのドラッグ アンド ドロップのサポート

ドラッグ アンド ドロップ操作には通常、ドラッグ 元のドラッグ ソースと、ドロップされたオブジェクトを受け取るドロップ ターゲットの 2 つの関係者が含まれます。 ドラッグ ソースとドロップターゲットは、同じアプリケーションまたは別のアプリケーションの UI 要素である場合があります。

ドラッグ アンド ドロップで操作できるオブジェクトの種類と数は完全に任意です。 たとえば、ファイル、フォルダー、コンテンツの選択は、ドラッグ アンド ドロップ操作によって操作される一般的なオブジェクトの一部です。

ドラッグ アンド ドロップ操作中に実行される特定のアクションは、アプリケーション固有であり、多くの場合、コンテキストによって決定されます。 たとえば、選択したファイルを同じストレージ デバイス上のフォルダーから別のフォルダーにドラッグすると、既定ではファイルが移動されますが、UNC (汎用名前付け規則) 共有からローカル フォルダーにファイルをドラッグすると、既定でファイルがコピーされます。

WPF によって提供されるドラッグ アンド ドロップ機能は、さまざまなドラッグ アンド ドロップ シナリオをサポートするために、柔軟性が高くカスタマイズ可能に設計されています。 ドラッグ アンド ドロップでは、1 つのアプリケーション内または異なるアプリケーション間でのオブジェクトの操作がサポートされます。 WPF アプリケーションとその他の Windows アプリケーション間のドラッグ アンド ドロップも完全にサポートされています。

WPF では、任意の UIElement または ContentElement をドラッグ アンド ドロップに参加できます。 ドラッグ アンド ドロップ操作に必要なイベントとメソッドは、DragDrop クラスで定義されます。 UIElement クラスと ContentElement クラスには、UIElement または ContentElement が基本要素として継承されたときにイベントがクラス メンバー リストに表示されるように、DragDrop 添付イベントのエイリアスが含まれています。 これらのイベントにアタッチされたイベント ハンドラーは、基になる DragDrop アタッチされたイベントにアタッチされ、同じイベント データ インスタンスを受け取ります。 詳細については、UIElement.Drop イベントを参照してください。

重要

OLE ドラッグ アンド ドロップは、インターネット ゾーン内では機能しません。

データ転送

ドラッグ アンド ドロップは、データ転送のより一般的な領域の一部です。 データ転送には、ドラッグ アンド ドロップ操作とコピーアンドペースト操作が含まれます。 ドラッグ アンド ドロップ操作は、システム クリップボードを使用して 1 つのオブジェクトまたはアプリケーションから別のオブジェクトまたはアプリケーションにデータを転送するために使用されるコピーアンドペースト操作または切り取り/貼り付け操作に似ています。 どちらの種類の操作でも、次のものが必要です。

  • データを提供するソース オブジェクト。

  • 転送されたデータを一時的に格納する方法。

  • データを受け取るターゲット オブジェクト。

コピーアンドペースト操作では、転送されたデータを一時的に保存するためにシステムクリップボードが使用されます。ドラッグ アンド ドロップ操作では、データの格納に DataObject が使用されます。 概念的には、データ オブジェクトは、実際のデータを含む Object の 1 つ以上のペアと、対応するデータ形式識別子で構成されます。

ドラッグ ソースは、静的な DragDrop.DoDragDrop メソッドを呼び出し、転送されたデータをそのメソッドに渡すことによって、ドラッグ アンド ドロップ操作を開始します。 DoDragDrop メソッドは、必要に応じてデータを DataObject に自動的にラップします。 データ形式をより詳細に制御するには、データを DoDragDrop メソッドに渡す前に DataObject でラップします。 ドロップ ターゲットは、DataObjectからデータを抽出する役割を担います。 データ オブジェクトの操作の詳細については、「データ オブジェクトとデータ オブジェクト」を参照してください。

ドラッグ アンド ドロップ操作のソースとターゲットは UI 要素です。ただし、実際に転送されるデータは、通常、視覚的な表現を持っていません。 Windows エクスプローラーでファイルをドラッグするときに発生するなど、ドラッグされたデータを視覚的に表現するコードを記述できます。 既定では、データを移動するかコピーするかなど、ドラッグ アンド ドロップ操作がデータに与える影響を表すようにカーソルを変更することで、フィードバックがユーザーに提供されます。

ドラッグ アンド ドロップ効果

ドラッグ アンド ドロップ操作は、転送されたデータに異なる影響を与える可能性があります。 たとえば、データをコピーしたり、データを移動したりすることができます。 WPF は、ドラッグ アンド ドロップ操作の効果を指定するために使用できる DragDropEffects 列挙体を定義します。 ドラッグ ソースでは、DoDragDrop メソッドでソースで許可される効果を指定できます。 ドロップ ターゲットでは、DragEventArgs クラスの Effects プロパティでターゲットが意図する効果を指定できます。 ドロップ ターゲットが DragOver イベントで目的の効果を指定すると、その情報は GiveFeedback イベントのドラッグ ソースに戻されます。 ドラッグ ソースはこの情報を使用して、ドロップ ターゲットがデータに与える影響をユーザーに通知します。 データが削除されると、ドロップ ターゲットは、Drop イベントでの実際の効果を指定します。 その情報は、DoDragDrop メソッドの戻り値としてドラッグ ソースに返されます。 ドロップ ターゲットが allowedEffectsのドラッグ ソース リストにない効果を返す場合、データ転送を行わずにドラッグ アンド ドロップ操作が取り消されます。

WPF では、DragDropEffects 値はドラッグ アンド ドロップ操作の効果に関するドラッグ ソースとドロップ ターゲットの間の通信を提供するためにのみ使用されることに注意してください。 ドラッグ アンド ドロップ操作の実際の効果は、アプリケーションで適切なコードを記述するかどうかによって異なります。

たとえば、ドロップ ターゲットでは、データをドロップした場合の影響がデータの移動であることを指定できます。 ただし、データを移動するには、ターゲット要素に追加し、ソース要素から削除する必要があります。 ソース要素は、データの移動を許可することを示している可能性がありますが、ソース要素からデータを削除するコードを指定しない場合、最終的な結果はデータがコピーされ、移動されません。

ドラッグ アンド ドロップ イベント

ドラッグ アンド ドロップ操作では、イベント ドリブン モデルがサポートされます。 ドラッグ ソースとドロップ ターゲットの両方で、標準的なイベント セットを使用してドラッグ アンド ドロップ操作を処理します。 次の表は、標準的なドラッグ アンド ドロップ イベントをまとめたものです。 これらは、DragDrop クラスの添付イベントです。 添付イベントの詳細については、「添付イベントの概要 」を参照してください。

ソース イベントをドラッグする

出来事 概要
GiveFeedback このイベントは、ドラッグ アンド ドロップ操作中に継続的に発生し、ドロップ ソースがユーザーにフィードバック情報を提供できるようにします。 このフィードバックは、通常、ドロップ ターゲットによって許可される効果を示すためにマウス ポインターの外観を変更することによって提供されます。 これはバブリング イベントです。
QueryContinueDrag このイベントは、ドラッグ アンド ドロップ操作中にキーボードまたはマウス ボタンの状態が変更された場合に発生し、ドロップ ソースがキー/ボタンの状態に応じてドラッグ アンド ドロップ操作をキャンセルできるようにします。 これはバブリング イベントです。
PreviewGiveFeedback GiveFeedbackのトンネリング・バージョン。
PreviewQueryContinueDrag トンネリング バージョンの QueryContinueDrag です。

ターゲット イベントを削除する

出来事 概要
DragEnter このイベントは、オブジェクトがドロップ ターゲットの境界にドラッグされたときに発生します。 これはバブリング イベントです。
DragLeave このイベントは、オブジェクトがドロップ ターゲットの境界からドラッグされたときに発生します。 これはバブリング イベントです。
DragOver このイベントは、ドロップ ターゲットの境界内でオブジェクトがドラッグ (移動) されている間に継続的に発生します。 これはバブリング イベントです。
Drop このイベントは、ドロップターゲットにオブジェクトがドロップされたときに発生します。 これはバブリング イベントです。
PreviewDragEnter DragEnterのトンネリング版。
PreviewDragLeave トンネリング バージョンの DragLeave です。
PreviewDragOver DragOverのトンネリング版。
PreviewDrop Dropのトンネリングバージョン。

オブジェクトのインスタンスのドラッグ アンド ドロップ イベントを処理するには、前の表に示したイベントのハンドラーを追加します。 クラス レベルでドラッグ アンド ドロップ イベントを処理するには、対応する仮想 On*Event メソッドと On*PreviewEvent メソッドをオーバーライドします。 詳細については、「コントロール基底クラスによるルーティング イベントのクラス処理」を参照してください。

ドラッグ アンド ドロップの実装

UI 要素には、ドラッグ ソース、ドロップ ターゲット、またはその両方を指定できます。 基本的なドラッグ アンド ドロップを実装するには、ドラッグ アンド ドロップ操作を開始し、ドロップされたデータを処理するコードを記述します。 オプションのドラッグ アンド ドロップ イベントを処理することで、ドラッグ アンド ドロップエクスペリエンスを強化できます。

基本的なドラッグ アンド ドロップを実装するには、次のタスクを実行します。

  • ドラッグ ソースとなる要素を特定します。 ドラッグ ソースには、UIElement または ContentElementを指定できます。

  • ドラッグ アンド ドロップ操作を開始するイベント ハンドラーをドラッグ ソースに作成します。 イベントは通常、MouseMove イベントです。

  • ドラッグ ソース イベント ハンドラーで、DoDragDrop メソッドを呼び出してドラッグ アンド ドロップ操作を開始します。 DoDragDrop 呼び出しで、ドラッグ ソース、転送するデータ、および許可される効果を指定します。

  • ドロップ ターゲットとなる要素を特定します。 ドロップ ターゲットは、UIElement または ContentElementできます。

  • ドロップ ターゲットで、AllowDrop プロパティを trueに設定します。

  • ドロップ ターゲットで、ドロップされたデータを処理する Drop イベント ハンドラーを作成します。

  • Drop イベント ハンドラーで、GetDataPresent メソッドと GetData メソッドを使用して DragEventArgs からデータを抽出します。

  • Drop イベント ハンドラーで、データを使用して目的のドラッグ アンド ドロップ操作を実行します。

次のタスクに示すように、カスタム DataObject を作成し、オプションのドラッグ ソース イベントとドロップ ターゲット イベントを処理することで、ドラッグ アンド ドロップの実装を強化できます。

  • カスタム データまたは複数のデータ項目を転送するには、DoDragDrop メソッドに渡す DataObject を作成します。

  • ドラッグ中に追加のアクションを実行するには、ドロップ ターゲットの DragEnterDragOver、および DragLeave イベントを処理します。

  • マウス ポインターの外観を変更するには、ドラッグ ソースで GiveFeedback イベントを処理します。

  • ドラッグ アンド ドロップ操作の取り消し方法を変更するには、ドラッグ ソースで QueryContinueDrag イベントを処理します。

ドラッグ アンド ドロップの例

このセクションでは、Ellipse 要素のドラッグ アンド ドロップを実装する方法について説明します。 Ellipse はドラッグ ソースとドロップ ターゲットの両方です。 転送されるデータは、楕円の Fill プロパティの文字列表現です。 次の XAML は、Ellipse 要素と、それが処理するドラッグ アンド ドロップ関連のイベントを示しています。 ドラッグ アンド ドロップを実装する方法の完全な手順については、「チュートリアル: ユーザー コントロールでのドラッグ アンド ドロップの有効化」を参照してください。

<Ellipse Height="50" Width="50" Fill="Green"
     MouseMove="ellipse_MouseMove"
     GiveFeedback="ellipse_GiveFeedback"
     AllowDrop="True"
     DragEnter="ellipse_DragEnter" DragLeave="ellipse_DragLeave"
     DragOver="ellipse_DragOver" Drop="ellipse_Drop" />

要素がドラッグ元になるようにする

ドラッグ ソースであるオブジェクトは、次の処理を行います。

  • ドラッグが発生したタイミングを識別します。

  • ドラッグ アンド ドロップ操作を開始します。

  • 転送するデータを識別する。

  • ドラッグ アンド ドロップ操作が転送されたデータに与える影響を指定します。

ドラッグ ソースは、許可されたアクション (移動、コピー、なし) に関するフィードバックをユーザーに提供し、ドラッグ中に ESC キーを押すなど、追加のユーザー入力に基づいてドラッグ アンド ドロップ操作をキャンセルすることもできます。

ドラッグが発生するタイミングを判断し、DoDragDrop メソッドを呼び出してドラッグ アンド ドロップ操作を開始するのは、アプリケーションの役割です。 通常、これは、マウス ボタンが押されている間に、ドラッグする要素の上に MouseMove イベントが発生した場合です。 次の例は、Ellipse 要素の MouseMove イベント ハンドラーからドラッグ アンド ドロップ操作を開始してドラッグ ソースにする方法を示しています。 転送されるデータは、楕円の Fill プロパティの文字列表現です。

private void ellipse_MouseMove(object sender, MouseEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null && e.LeftButton == MouseButtonState.Pressed)
    {
        DragDrop.DoDragDrop( ellipse,
                             ellipse.Fill.ToString(),
                             DragDropEffects.Copy);
    }
}
Private Sub Ellipse_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing AndAlso e.LeftButton = MouseButtonState.Pressed Then
        DragDrop.DoDragDrop(ellipse, ellipse.Fill.ToString(), DragDropEffects.Copy)
    End If
End Sub

MouseMove イベント ハンドラー内で、DoDragDrop メソッドを呼び出してドラッグ アンド ドロップ操作を開始します。 DoDragDrop メソッドは、次の 3 つのパラメーターを受け取ります。

  • dragSource – 転送されたデータのソースである依存関係オブジェクトへの参照。これは通常、MouseMove イベントのソースです。

  • data - 転送されたデータを含むオブジェクトで、DataObjectにラップされます。

  • allowedEffects - ドラッグ アンド ドロップ操作の許可される効果を指定する DragDropEffects 列挙値の 1 つ。

シリアル化可能なオブジェクトは、data パラメーターで渡すことができます。 データがまだ DataObjectにラップされていない場合は、新しい DataObjectに自動的にラップされます。 複数のデータ項目を渡すには、自分で DataObject を作成し、DoDragDrop メソッドに渡す必要があります。 詳細については、「データ オブジェクトとデータ オブジェクト」を参照してください。

allowedEffects パラメーターを使用して、ドラッグ ソースで転送されたデータをドロップ ターゲットで実行できるようにする操作を指定します。 ドラッグ ソースの一般的な値は、CopyMove、および Allです。

手記

ドロップターゲットは、ドロップされたデータに対してどのような効果を意図するかを指定することもできます。 たとえば、ドロップターゲットがドロップするデータ型を認識しない場合、許可された効果を Noneに設定することで、データを拒否できます。 これは通常、DragOver イベント ハンドラーで行われます。

ドラッグ ソースでは、必要に応じて、GiveFeedback イベントと QueryContinueDrag イベントを処理できます。 これらのイベントには、イベントを処理済みとしてマークしない限り使用される既定のハンドラーがあります。 既定の動作を変更する必要がある場合を除き、通常、これらのイベントは無視します。

ドラッグ元がドラッグされている間、GiveFeedback イベントは継続的に発生します。 このイベントの既定のハンドラーは、ドラッグ ソースが有効なドロップ ターゲット上にあるかどうかを確認します。 存在する場合は、ドロップ ターゲットの許可された効果を確認します。 次に、許可されたドロップ効果に関するフィードバックをエンド ユーザーに提供します。 これは通常、マウス カーソルをドロップなし、コピー、または移動カーソルに変更することで行われます。 カスタム カーソルを使用してユーザーにフィードバックを提供する必要がある場合にのみ、このイベントを処理する必要があります。 このイベントを処理する場合は、既定のハンドラーがハンドラーをオーバーライドしないように、必ず処理済みとしてマークしてください。

ドラッグ元がドラッグされている間、QueryContinueDrag イベントは継続的に発生します。 このイベントを処理すると、ESC キー、Shift キー、Ctrl キー、Alt キーの状態、およびマウス ボタンの状態に基づいて、ドラッグ アンド ドロップ操作を終了するアクションを決定できます。 このイベントの既定のハンドラーは、ESC キーを押すとドラッグ アンド ドロップ操作を取り消し、マウス ボタンが離された場合はデータを削除します。

注意

これらのイベントは、ドラッグ アンド ドロップ操作中に継続的に発生します。 そのため、イベント ハンドラーでリソースを大量に消費するタスクは避ける必要があります。 たとえば、GiveFeedback イベントが発生するたびに新しいカーソルを作成するのではなく、キャッシュされたカーソルを使用します。

要素をドロップ ターゲットにする

ドロップ ターゲットであるオブジェクトは、次の処理を行います。

  • 有効なドロップ ターゲットであることを指定します。

  • ドラッグ元に対して、ターゲットの上にドラッグしたときに応答する。

  • 転送されたデータが受信できる形式であることを確認します。

  • 削除されたデータの処理。

要素がドロップ ターゲットであることを指定するには、その AllowDrop プロパティを trueに設定します。 その後、ドロップ ターゲット イベントが要素で発生し、それらを処理できるようになります。

ドロップ ターゲットが評価されると、ヒット テストが実行され、カーソルが要素のビジュアルの上にあるかどうかを識別します。 Canvasなどの一部のコントロールにはビジュアルがなく、ビジュアルを追加しない限りドロップ ターゲットとして使用できません。 Canvas.Background プロパティを任意の色に設定して、Canvas を色で塗りつぶすビジュアルを作成します。 Canvas を透明に保ち、ドロップ ターゲットとして有効にするには、Background プロパティを Transparentに設定します。

ドラッグ アンド ドロップ操作中に、ドロップ ターゲットで次の一連のイベントが発生します。

  1. DragEnter

  2. DragOver

  3. DragLeave または Drop

DragEnter イベントは、データがドロップ ターゲットの境界にドラッグされたときに発生します。 通常、このイベントは、アプリケーションに適した場合に、ドラッグ アンド ドロップ操作の効果のプレビューを提供するために処理します。 DragEnter イベントの DragEventArgs.Effects プロパティは、DragOver イベントで上書きされるため、設定しないでください。

次の例は、Ellipse 要素の DragEnter イベント ハンドラーを示しています。 このコードは、現在の Fill ブラシを保存することで、ドラッグ アンド ドロップ操作の効果をプレビューします。 次に、GetDataPresent メソッドを使用して、楕円の上にドラッグされている DataObject に、Brushに変換できる文字列データが含まれているかどうかを確認します。 その場合は、GetData メソッドを使用してデータが抽出されます。 その後、Brush に変換され、楕円に適用されます。 変更は、DragLeave イベント ハンドラーで元に戻されます。 データを Brushに変換できない場合、アクションは実行されません。

private Brush _previousFill = null;
private void ellipse_DragEnter(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill;

        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush, convert it.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private _previousFill As Brush = Nothing
Private Sub Ellipse_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ' Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

DragOver イベントは、データがドロップ ターゲットの上にドラッグされている間、継続的に発生します。 このイベントは、ドラッグ ソースの GiveFeedback イベントとペアになっています。 DragOver イベント ハンドラーでは、通常、GetDataPresent メソッドと GetData メソッドを使用して、転送されたデータがドロップ ターゲットで処理できる形式であるかどうかを確認します。 また、修飾キーが押されているかどうかを確認することもできます。これは通常、ユーザーが移動アクションまたはコピー 操作を行うかどうかを示します。 これらのチェックを実行した後、DragEventArgs.Effects プロパティを設定して、データのドロップの効果をドラッグ ソースに通知します。 ドラッグ ソースは、GiveFeedback イベント引数でこの情報を受け取り、ユーザーにフィードバックを提供する適切なカーソルを設定できます。

次の例は、Ellipse 要素の DragOver イベント ハンドラーを示しています。 このコードは、省略記号の上にドラッグされている DataObject に、Brushに変換できる文字列データが含まれているかどうかを確認します。 その場合は、DragEventArgs.Effects プロパティを Copyに設定します。 これは、データを楕円にコピーできることをドラッグ ソースに示します。 データを Brushに変換できない場合、DragEventArgs.Effects プロパティは Noneに設定されます。 これは、楕円がデータの有効なドロップ ターゲットではないことをドラッグ ソースに示します。

private void ellipse_DragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.None;

    // If the DataObject contains string data, extract it.
    if (e.Data.GetDataPresent(DataFormats.StringFormat))
    {
        string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

        // If the string can be converted into a Brush, allow copying.
        BrushConverter converter = new BrushConverter();
        if (converter.IsValid(dataString))
        {
            e.Effects = DragDropEffects.Copy | DragDropEffects.Move;
        }
    }
}
Private Sub Ellipse_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    e.Effects = DragDropEffects.None

    ' If the DataObject contains string data, extract it.
    If e.Data.GetDataPresent(DataFormats.StringFormat) Then
        Dim dataString = e.Data.GetData(DataFormats.StringFormat)

        ' If the string can be converted into a Brush, convert it.
        Dim converter As New BrushConverter()
        If converter.IsValid(dataString) Then
            e.Effects = DragDropEffects.Copy Or DragDropEffects.Move
        End If
    End If
End Sub

DragLeave イベントは、データがドロップされずにターゲットの境界の外へドラッグされたときに発生します。 このイベントを処理して、DragEnter イベント ハンドラーで行ったことを元に戻します。

次の例は、Ellipse 要素の DragLeave イベント ハンドラーを示しています。 このコードは、保存した Brush を楕円に適用することで、DragEnter イベントハンドラーで実行されたプレビューを元に戻します。

private void ellipse_DragLeave(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        ellipse.Fill = _previousFill;
    }
}
Private Sub Ellipse_DragLeave(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ellipse.Fill = _previousFill
    End If
End Sub

Drop イベントは、ドロップ ターゲット上でデータがドロップされるときに発生します。既定では、これはマウス ボタンが離されたときに発生します。 Drop イベント ハンドラーでは、GetData メソッドを使用して、DataObject から転送されたデータを抽出し、アプリケーションで必要なデータ処理を実行します。 Drop イベントは、ドラッグ アンド ドロップ操作を終了します。

次の例は、Ellipse 要素の Drop イベント ハンドラーを示しています。 このコードは、ドラッグ アンド ドロップ操作の効果を適用し、DragEnter イベント ハンドラーのコードに似ています。 楕円形の上にドラッグされている DataObject に、Brushに変換できる文字列データが含まれているかどうかを確認します。 その場合、Brush が楕円に適用されます。 データを Brushに変換できない場合、アクションは実行されません。

private void ellipse_Drop(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush,
            // convert it and apply it to the ellipse.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private Sub Ellipse_Drop(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

関連項目