Microsoft 是否真的提供了在 WPF 上“正常工作”的 Rx / Silverlight Toolkit DragDrop 的构建?
据我所知,Rx DragDrop 的东西只在 SL 工具包(不是 WPF)中可用。
SL Toolkit 似乎暗示您可以在 WPF(各种#defines)中使用它,但没有提供有关如何操作的更多信息。
如果我只想要 DragDrop 的东西,将它移植到 WPF 是否很容易,或者 100M 行的 SL Toolkit 是否可以随行?
Microsoft 是否真的提供了在 WPF 上“正常工作”的 Rx / Silverlight Toolkit DragDrop 的构建?
据我所知,Rx DragDrop 的东西只在 SL 工具包(不是 WPF)中可用。
SL Toolkit 似乎暗示您可以在 WPF(各种#defines)中使用它,但没有提供有关如何操作的更多信息。
如果我只想要 DragDrop 的东西,将它移植到 WPF 是否很容易,或者 100M 行的 SL Toolkit 是否可以随行?
我不能对 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 提取出来并在您的应用程序中使用。
我希望这会有所帮助。