Silverlightのドラッグ&ドロップAPI
はじめ
ドラッグ&ドロップは、一般的なUXのパラダイムとのリクエストが特徴です。 Silverlight 4のベータ版では、我々は、画像ファイルをドラッグしてSilverlightアプリケーションにそれらをドロップするの最も一般的なシナリオを有効にするAPIの基本セットを導入し、そして我々は、私たちは、APIの変更なしで道をより多くのドラッグアンドドロップ機能を公開できるようにAPIを設計、うまくいけば。
API
以下の新しいAPIのコアは、次のとおりです。
名前空間 System.Windows
{
パブリック抽象クラスのUIElement:のDependencyObject
{
/ /フィールド
をpublic static readonly DependencyPropertyにAllowDropProperty。
/ /イベント
パブリックイベント DragEventHandlerのdragEnter。
パブリックイベント DragEventHandler離れたとき。
パブリックイベント DragEventHandler DragOverイベント。
パブリックイベント DragEventHandlerドロップ;
/ /プロパティ
公共のブール値 AllowDropを{取得または設定します。}
}
sender, DragEventArgs e); 公共デリゲートボイド DragEventHandler( オブジェクト送信者、しているDragEventArgs電子);
公共sealedクラスしているDragEventArgs。RoutedEventArgs
{
/ /メソッド
公開ポイントの場合はgetPosition(UIElementのrelativeToを);
/ /プロパティ
公共の IDataObjectのデータは、{[SecuritySafeCritical]取得;}
公共のブール値は、処理{取得または設定します。}
}
}
名前空間 System.Windows.Controls
{
パブリック抽象クラスControl:FrameworkElementは
{
保護仮想無効 OnDragEnterイベント(しているDragEventArgs電子);
保護仮想無効 OnDragLeave(しているDragEventArgs電子);
保護された仮想ボイド OnDragOverイベント(しているDragEventArgs電子);
保護された仮想ボイド OnDropを(しているDragEventArgs電子);
}
}
- AllowDropを:これは、エレメントがドロップターゲットかどうかを示す、依存関係プロパティです。
- のdragEnter、離れたとき、DragOverイベント&Dropは:これらのルーティングイベントです。 彼らはバブルアップし、唯一の真のAllowDropを設定された要素で火災。
- OnDragEnterイベントは、OnDragLeave、OnDragOverイベント&OnDropを:これらはサブクラスがオーバーライドする仮想関数を保護されています。
- しているDragEventArgs:このクラスは、ドロップターゲットイベントハンドラまたはメソッドのオーバーライドは、ドラッグまたはドロップされたデータにアクセスすることができます。
使用法
Silverlightのドラッグ&ドロップAPIを使用するために主に2つの方法があります。
- Silverlightアプリケーションは、それらのドロップターゲットイベントを処理し、イベントハンドラでドロップされたファイルを処理することができます。
- Silverlightコントロールは、ドラッグアンドドロップされたデータを処理するために、それらのドロップターゲット仮想関数をオーバーライドし、自身がドロップターゲットとなるように有効にすることができます。
制限事項
Silverlight 4のベータ版に同梱されてドラッグアンドドロップ機能は、最も一般的なシナリオが可能になります:ファイルのドロップターゲットとしてのSilverlightプラグイン。 現在の実装では、次の制限事項を注意してください。
- はドロップソースのサポート(QueryContinueDrag&付いた状態では)ありません。
- しているDragEventArgsにはDragDropEffectsまたはDragDropKeyStatesはありません。
- ドラッグされたオブジェクトまたはDragDropEffectsのためのビジュアルはありません。
- 唯一のファイルのドラッグ&ドロップがサポートされています。
- すべてのドロップターゲットイベントには、ファイルをドラッグアンドドロップされている時のみ発動。
- IDataObjectを、DataObjectおよびDragEventArgs.Dataは1つの形式のみサポートしています:"FileDropを"、およびデータは、型のFileInfo []である。
- IDataObjectのメソッドのほとんどは、て、NotImplementedExceptionをスローする。
- ドラッグとWindows上で動作するように降下するため、Silverlightプラグインには、ウィンドウがされている必要があります。 <param name="windowless" value="true"/>が指定されている場合、別の単語では、、ドロップイベントは発生しません。
- Mac上のSilverlightプラグインが常にウィンドウなので、あなたは、SilverlightのドロップイベントをトリガするためにはJavaScriptのドロップイベントをフックする必要があります。 あなたのSilverlightアプリケーションは、同様にWindowsのようにMac上のファイルのドロップをサポートしたい場合は、別の単語では、は、ホストするHTMLやASPXページに次のスクリプトとSilverlightプラグインの属性を追加する必要があります。
<! - HEADタグの終了前に次のスクリプトを追加します - >
<script type= "text/javascript">
機能 handleDragEnter(oEvent){
/ /はデフォルトの操作を防止
oEvent.preventDefault();
VARフラグ= silverlightControl.dragEnter(oEvent);
我々はそれを処理する/ /場合に成功してイベントの伝播を停止する
場合 (フラグ)
oEvent.stopPropagation();
}
機能 handleDragLeave(oEvent){
/ /はデフォルトの操作を防止
oEvent.preventDefault();
VARフラグ= silverlightControl.dragLeave(oEvent);
我々はそれを処理する/ /場合に成功してイベントの伝播を停止する
場合 (フラグ)
oEvent.stopPropagation();
}
機能 handleDragOver(oEvent){
/ /はデフォルトの操作を防止
oEvent.preventDefault();
VARフラグ= silverlightControl.dragOver(oEvent);
我々はそれを処理する/ /場合に成功してイベントの伝播を停止する
場合 (フラグ)
oEvent.stopPropagation();
}
機能 handleDropEvent(oEvent){
/ /はデフォルトの操作を防止
oEvent.preventDefault();
VARフラグ= silverlightControl.dragDrop(oEvent);
我々はそれを処理する/ /場合に成功してイベントの伝播を停止する
場合 (フラグ)
oEvent.stopPropagation();
}
</スクリプト>
<! - SilverlightのドロップターゲットイベントをトリガーするJavaScriptのドロップターゲットイベントを使用する - >
ondragover= "handleDragOver(event)" ID ="silverlightControl"乗ったとき="handleDragEnter(イベント)"ondragoverイベント="handleDragOver(イベント)"
> ondragleave ="handleDragLeave(イベント)"OnDropを="handleDropEvent(イベント)"> - DragEventArgs.DataはDropイベントでのみアクセス可能です。 のdragEnter、dragOverと離れたときにDragEventArgs.Dataにアクセスすると、可能性がありますSecurityExceptionを 。 とDragEventArgs.DataからFileInfoオブジェクトのディレクトリ、ディレクトリ名またはFullNameプロパティにアクセスすると、ArgumentNullExceptionを引き起こす可能性があります。
デモアプリケーション
下のデモアプリケーションは、次のとおりです。
- 左上のネストされたグリッドがいるDragEventArgsの情報を表示するには、ドロップターゲットイベントハンドラを使用してください。
- 右上のネストされたグリッドは、それが画像の場合、ドロップされたファイルをレンダリングするためにOnDropをメソッドをオーバーライドImageDropTargetのユーザーコントロールが含まれています。
- 下のリストボックスは、ドロップターゲットイベントを、それらのバブルアップ、としているDragEventArgs情報のシーケンスを示しています。
あなたは、完全なソースを見つけることができますここで 。
フィードバック
我々は、Silverlightにドラッグ&ドロップを追加するために興奮している一方で、我々は改善する/終了するのがたくさんある知っている、と私たちは解放するだけでベータ版です。 いつものように、あなたのフィードバックが高く評価され、そして私たちは仕事を優先順位を決定する手助けとなる重要なデータポイントとして使用されます。 ありがとう!
![あなたがSilverlight 4のベータ版がインストールされている場合、DragDropDemoを実行する]をクリックします。 Click to run DragDropDemo if you have Silverlight 4 Beta installed.](http://www.ningzhang.org/wp-content/uploads/2009/11/image1.png)










私はドラッグとSilverlightアプリケーションにOutlookから削除するには解決策を見つけるしようとしています。
プラグインでこれを行うことができます? 私はあなたのソースを実行してみましたが、今これを処理していないようだ。
任意の提案ですか?
感謝
どのように私は1つだけのように動作するようにDragDropTargetを得るのですか?
私はアイテムをドラッグし、それらがどこに落ちて戻るようにしたくない
@デビッドライスナー
こんにちはデビッド、
ユーザーは、trueにAllDropセットを持つ一方のコントロールがある場合は、全体のプラグインができるようにドロップカーソルを表示する、プラグインレベルで、すなわち標準的なカーソル変更されたことがわかります。しかし、それはです:はい、動作がかなりSL4 RTMで同じです。特定のコントロールではない、とそれはカスタマイズ可能ではない、すなわち、カーソルがfalseにAllDrop設定されたコントロールでは変更されません、としているDragEventArgsで設定するDragDropEffectsはありません。 我々は将来のリリースでより多くのドラッグ&ドロップ機能を実装することができます。
おかげで、
- 寧
この非常に便利かつ簡単に実装できる機能をありがとう!
質問:あなたのオリジナルの記事では、Silverlight 4 Betaで"ドラッグされたオブジェクトまたはDragDropEffectsのためのビジュアルがない"と述べた。
これはまた、最終のSilverlight 4リリースの場合ですか。
WindowsエクスプローラからSilverlightのリストボックス(ListBox)コントロールにイメージをドラッグするとき、それはカーソルの外観をカスタマイズするために非常に有用であること、そして、ターゲットの要素が持っているかどうかに応じて異なる形式のカーソルを持ってAllowDropを有効にするかではない。
ありがとう!
こんにちは、サンプルコードをありがとうございました。
こんにちは、
それは、ドラッグアクションが開始からDataGridDragDropTargetを防止することができる?
しかし私が欲しいのは唯一のDragSourceおよびDropTargetが唯一のような別のものとして1つのデータグリッドを使用することです。 アイテムの上にマウスを押して移動したときとDropTargetにのみ、データグリッドは、この"StartDragShadowを"示してはならない。
ありがとう!
スティーブン
@ルディ
私もあなたをknow.thankしたい!
に関して
Silverlightの
@ルディ
私の他の回答を参照してください。 Silverlightツールキットは、既に持ってListBoxDragDropTargetをするので、リストボックス(ListBox)コントロールからドラッグできます。 今のところは、独自のキャンバスのドラッグドロップのターゲットコンテナを実装する必要があります。
@ギガバイト
今SL4ランタイムはファイルのドロップターゲットとしてのSLプラグインをサポートしており、唯一のドロップターゲットのプロパティ(AllDrop)とイベント(dragEnterイベント/まま/移動、ドロップを)公開されますが、(付いた状態、QueryContinueDrag)ソースのイベントをドラッグできない。 これは、いずれかのIDataObjectを経由して完全に拡張可能ではありません。 あなたが待つことができない場合、今のあなたの最高のチャンスは、SLのプラグイン内にドラッグして、DataGridとの間でドロップを可能にするツールキットの実装、を見ることです。 コードがでていますDataGridDragDropTarget.csソース\ Controls.Data.Toolkitのプロジェクトの下にある。 おかげ。
こんにちは、私は、DataGridコントロール上でドラッグ&ドロップする実装方法を知りたいですか?
私は、リストボックスからキャンバスにドラッグ&ドロップオブジェクト(アイコン)を実装するためにどのような方法があるかどうかを知りたい?
よろしく
ルディ
@ブライスプルニエ
はい。 ジャファルは 、WPFの互換性、Silverlight 3およびSilverlight 4の両方のためのドラッグアンドドロップ機能をほぼ完全に実装しています。 それはの一部として出荷されていますSilverlightツールキット 。 私は非常に彼の調べることをお勧めブログ記事をより多くの情報のために。
2つのドラッグアンドドロップの実装の主な違いを注意してください:ツールキットのバージョンは、ランタイムの上に実装されているので、*のDragDropTargetコンテナを必要とし、Silverlightプラグインコントロール内の要素間でのみ機能します。 Toolkitの実装は、Silverlight 4のツールキットのように、Microsoft.Windows.DragDrop.AllowDropがUIElement.AllowDropプロパティを使用することができるときに、ランタイムAPIをドラッグアンドドロップ活用しています。 ランタイムはすべてのUIElementのためのドロップターゲットイベントを公開しながら、ツールキットの実装には既にデータグリッド、リストボックス(ListBox)コントロールとTreeViewコントロールのような重要なコントロールにそれらのイベントを処理しますので、それは本当に使いやすいです。 我々は、APIは可能な限り互換性があることを確認作ったので、人々は今一緒に両方を使用し、比較的簡単にランタイムがより多くのドラッグアンドドロップ機能を公開すると、ランタイム実装に移行することができます。 この前の記事で提起したように、これはまた、Silverlightツールキットの一般的なアプローチであるSilverlightコントロール 。
SL4ツールキット(System.Windows.Controls.Toolkitは)内Silverligthドラッグ&ドロップのより高いレベルのドラッグアンドドロップの実装を提供しています。
ないすべての場合は、現在、SL 4ツールキットによってサポートされていますが、easely抽象クラスのDragDropTargetから独自に作成することもできます。
に関して