2010-01-16 21 views
0

微軟是否實際上提供了一個在WPF上「正常工作」的Rx/Silverlight工具包DragDrop的構建?Silverlight工具包WPF上的DragDrop

從我能告訴Rx DragDrop的東西只在SL Toolkit(不是WPF)中可用。

SL Toolkit似乎暗示你可以在WPF中使用它(各種#defines),但沒有提供關於如何去做的更多信息。

如果我只是想讓DragDrop的東西很容易將其移植到WPF,還是100萬行的SL Toolkit來搭配?

+0

我從來不喜歡的SL工具包實現,不是很MVVM,其不太可能ü想從一個到下一個拖動元素。更有可能你希望關聯一個數據有效載荷,爲這個拖拽操作創建一個特定的模板,並將有效載荷放在某種類型的拖放目標上。只是我的2美分! – Keith

+0

有一個很棒的WPF http://code.google.com/p/gong-wpf-dragdrop/不幸的是,我不知道silverlight - 這可能是太早了 - 也許你可以轉換鑼與SL一起工作但是這是一個很長的鏡頭。 – keyle

回答

0

我不能在Silverlight Toolkit上發表太多的評論,但我可以在Rx上發表評論。

Reactive Extensions (Rx)是一組通用的庫集合,用於將各種「推送」集合(事件,異步操作等)「提升」到第一類啓用LINQ的組合框架中。它可用於Silverlight,XNA & javascript,但更重要的是.NET 4.0 & .NET 3.5SP1,因此它可以與WPF一起使用。 (即使你不使用核心Rx代碼,.NET 3.5SP1的實現甚至支持許多並行任務庫,這可能是非常有用的。)

這就是說,因爲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工具包提供任何進一步的那麼它將是一個比較薄的輔助方法,你既可以重新發明或使用Reflector.NET提取出來,在你的應用程序中使用層。

我希望有幫助。