Silverlight Toolkit についてはあまりコメントできませんが、Rx についてはコメントできます。
Reactive Extensions (Rx)は、さまざまな「プッシュ」コレクション (イベント、非同期操作など) をファーストクラスの LINQ 対応の合成フレームワークに「持ち上げる」ことを可能にする汎用ライブラリ セットです。Silverlight、XNA、javascript で使用できますが、さらに重要なのは .NET 4.0 と .NET 3.5SP1 で使用できるため、WPF で使用できます。(.NET 3.5SP1 実装は、コア Rx コードを使用しない場合でも非常に役立つ並列タスク ライブラリの多くをバックポートします。)
とはいえ、Rx は汎用なので、WPF でイベントを使用してドラッグ アンド ドロップできる場合は、Rx を使用できます。
ドラッグ アンド ドロップ クエリは次のようになります。
var mouseDowns =
Observable.FromEvent<MouseButtonEventArgs>(element, "MouseDown");
var mouseMoves =
Observable.FromEvent<MouseEventArgs>(element, "MouseMove");
var mouseUps =
Observable.FromEvent<MouseButtonEventArgs>(element, "MouseUp");
var mouseDragPoints =
(from md in mouseDowns
select (from mm in mouseMoves.TakeUntil(mouseUps)
select mm.EventArgs.GetPosition(element))).Switch();
var mouseDragDeltas =
mouseDragPoints.Skip(1).Zip(mouseDragPoints, (p1, p0) =>
new Point(p1.X - p0.X, p1.Y - p0.Y));
テストせずにこのコードを簡単にまとめましたがPoint
、元のドラッグ開始点からの差分を観察できるはずであり、これはドラッグ操作中にのみ行われます。コードをシンプルに保つようにしました。特定のニーズに合わせて変更する必要があります。
Silverlight Toolkit がさらに何かを提供する場合、それはヘルパー メソッドの比較的薄いレイヤーに過ぎず、それらを再発明するか、Reflector.NET を使用して抽出し、アプリで使用することができます。
それが役立つことを願っています。