【问题标题】:How to indicate allowable drage & drop targets?如何指示允许的拖放目标?
【发布时间】:2011-10-14 04:15:29
【问题描述】:

我正在考虑 UI 设计(使用 WPF),但我不确定如何实现一个关键功能:用户将需要分配资源。关于可以进行哪些分配有一些规则,例如兼容性和可用性。我想显示资源列表和需求列表。用户可以通过将需求拖放到资源上来进行分配。

我想做的是通过突出显示满足给定需求的所有可分配资源,向用户展示可以进行哪些分配。这应该在拖动任何给定的需求时完成。

(我很乐意使用资源 ViewModels 上的属性和 XAML 中的触发器执行突出显示,并执行拖放操作。)

我没有看到任何与拖动开始或停止通用的事件;它们要么与源元素相关,要么与被主动拖过的元素相关。当开始拖动时,如何评估评估每个资源项兼容性的方法?

编辑:

当我更多地考虑这一点时,最好在选择项目时执行突出显示功能而不是开始拖动。由于项目通常位于 ListViews 或 TreeViews 中,因此拖动也会导致项目被选中。此外,用户在考虑他们的选择时不必启动并按住拖动。由于目标列表可能很长,用户可能需要滚动才能找到他们想要的目标,这在拖动时并不实用。

我可以轻松地监听 SelectionChanged 事件以评估潜在的放置目标。

【问题讨论】:

    标签: wpf drag-and-drop


    【解决方案1】:

    在 WPF 中,拖放服务的定义非常明确,同时指示其适用性是被拖动数据的有效可拖放视觉对象。

    http://msdn.microsoft.com/en-us/library/ms742859.aspx

    编辑

    根据您的要求,您需要在拖动开始时指明 \ highlight \focus 有效的可放置目标。

    为此,可放置的视觉对象必须注册自己以了解被拖动的数据类型。因此,所有放置目标都将在它们注册的此类数据被拖动时(即在DragDrop.DoDragDrop(..., <dragged data>, ...) 调用中)得到通知

    现在这很棘手,但您可以使用Clipboard services 来保存拖动的数据。当此类数据添加到剪贴板时,相同的剪贴板服务将通知注册的目标视觉对象。您可以有一个命令CanExecute(),它会在拖放视图上不断执行并检查剪贴板数据是否属于已注册的数据类型。如果是这样,它将设置一些基于视图模型的布尔属性,该属性已针对所有有效的放置目标附加为 true,这将通过附加的行为突出显示它们。

    在后退(拖放丢失)的情况下,必须清除剪贴板。

    当然,这说起来容易做起来难……但值得一试。

    【讨论】:

    • 也许我遗漏了一些东西,但我不知道如何将其用于我正在寻找的效果。这些似乎只适用于开始拖动的元素,或者拖动进入的元素。我当然可以使用它来指示是否允许用户将鼠标放在现在的位置。我想指出用户可能选择将鼠标移动到的多个元素。当鼠标不在给定元素中时,可以使用哪些 DragDrop 成员?
    • 您是说一旦拖动开始就显示\高亮\装饰有效的目标可放置视觉对象?
    • 是的。拖动开始后,我想评估所有可能的放置目标并直观地指示哪些(复数)可以放置,而无需拖动每个元素。我理解的方法只能指示用户是否可以将鼠标放在当前位置,可能需要用户“测试”多个位置。
    • 我不太清楚你所说的“注册”是什么意思。我在 WPF DragDrop 或剪贴板类中看不到任何对此类的引用。我确实看到了一些其他与 WinForms 相关的功能,但这似乎是一个窗口级的东西,可以在应用程序之间进行复制或拖动,不适用于 WPF 元素或非 UI 对象,例如 ViewModel。
    【解决方案2】:

    虽然我更新了问题,计划采用另一种 UI 方法(选择时突出显示),但我仍在思考我认为 WPF 拖放服务的缺点。

    突然间我意识到拖动的开始调用我的代码来获取被拖动的数据。我可以在那里做任何我想做的事,包括触发任何额外的 UI 效果!有了这个,在 DragDrop 类中期望这样的功能似乎有点愚蠢......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多