【问题标题】:Silverlight Toolkit DragDrop on WPFWPF 上的 Silverlight 工具包拖放
【发布时间】:2010-01-16 04:48:49
【问题描述】:

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

据我所知,Rx DragDrop 的内容仅在 SL 工具包(而非 WPF)中可用。

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

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

【问题讨论】:

  • 我从不喜欢 SL 工具包的实现,不是很 MVVM,你不太可能想将元素从一个拖到另一个。您更有可能想要关联数据的有效负载,为拖动操作启动特定模板并将有效负载放置在某种放置目标上。只是我的 2 美分!
  • WPF 有一个很棒的 code.google.com/p/gong-wpf-dragdrop 不幸的是我不知道 silverlight - 这可能还为时过早 - 也许你可以将 gong 转换为与 SL 一起使用,但这是一个长期的目标。跨度>

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


【解决方案1】:

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多