0

Microsoft 是否真的提供了在 WPF 上“正常工作”的 Rx / Silverlight Toolkit DragDrop 的构建?

据我所知,Rx DragDrop 的东西只在 SL 工具包(不是 WPF)中可用。

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

如果我只想要 DragDrop 的东西,将它移植到 WPF 是否很容易,或者 100M 行的 SL Toolkit 是否可以随行?

4

1 回答 1

0

我不能对 Silverlight Toolkit 发表太多评论,但我可以对 Rx 发表评论。

反应式扩展 (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 工具包提供任何进一步的功能,那么它将只是一个相对较薄的帮助方法层,您可以重新发明或使用 Reflector.NET 提取出来并在您的应用程序中使用。

我希望这会有所帮助。

于 2011-03-03T00:11:56.903 回答