WPF上的Silverlight Toolkit DragDrop

时间:2010-01-16 04:48:50

标签: .net wpf silverlight-toolkit system.reactive

Microsoft实际上是否提供了一个在WPF上“正常工作”的Rx / Silverlight Toolkit DragDrop版本?

据我所知,Rx DragDrop的东西只能在SL Toolkit中使用(不是WPF)。

SL Toolkit似乎意味着你可以在WPF(各种#defines)中使用它,但没有提供有关如何操作的更多信息。

如果我只想要DragDrop的东西,将它移植到WPF很容易,还是有100M系列的SL Toolkit可以用来骑行?

1 个答案:

答案 0 :(得分: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 Toolkit提供了更多内容,那么它只是一个相对较薄的辅助方法层,您可以重新发明或使用Reflector.NET来提取并在您的应用中使用。

我希望有所帮助。