【问题标题】:How can I drag and drop a xaml activity to a WF4 rehosted designer?如何将 xaml 活动拖放到 WF4 重新托管的设计器?
【发布时间】:2011-06-01 09:05:58
【问题描述】:

我了解WorkflowDesigner可以通过多种方式接收拖动的项目,例如:

  • 通过将项目从工具箱中拖放到设计器上:该类型的空活动将插入到设计器的放置位置。
  • 也可以从设计器中拖动一个活动并将其放置在设计器中的另一个位置,拖动的活动也将插入到放置位置。

是否有可能类似于这两种拖放机制,我可以将一个xaml活动拖到设计器中?我想到的是这个,

假设您有一个包含多个 xaml 文件的 ListView。我希望能够拖动 ListView 项目之一(即 xaml 文件之一),当我将它拖动到设计器上时,它就像我从工具箱中拖动某些东西一样(除了活动将从提供xml)。我知道我可以使用ActivityXamlServices.Load(filename) 从文件中创建运行时Activity,并且我希望将此活动插入到放置位置。但是当我拖放时如何告诉应用程序理解这一点?

【问题讨论】:

    标签: .net wpf drag-and-drop workflow-foundation workflow-foundation-4


    【解决方案1】:

    给定WorkflowDesigner designerActivity activity,并拖动源dataSource,使用此代码(致tilovell

    ModelItem mi = designer.Context.Services.GetService<ModelTreeManager>()
        .CreateModelItem(null, activity);
    DataObject data = new DataObject(DragDropHelper.ModelItemDataFormat, mi);
    DragDrop.DoDragDrop(dataSource, data, DragDropEffects.Copy);
    

    应用程序将进入拖放模式。设计师将收到作为 Activity 的 drop。

    【讨论】:

    • 那么这里的活动是什么?已编译的活动类型,加载了 ActivityXamlServices 或其他东西。如果它不是一个编译的活动,当您保存工作流时生成的 xaml 是什么样的?
    • 加载了 ActivityXamlServices 的东西。
    • Activity activity = ActivityXamlServices.Load(filename);
    • 有趣,通常 XAML 元素指的是 .NET 类型,但 ActivityXamlServices.Load() 不返回作为类型存在的类型或实例。使用 ActivityXamlServices.Load() 加载的完整活动树是否插入到最终 XAML 中?
    • 是的。行为与我将动态活动拖动到该位置完全相同
    【解决方案2】:

    您不能这样做,因为添加到工作流的活动需要编译。当您在 VS2010 中创建 XAML 活动并编译项目时,生成的已编译活动类型将添加到工具箱中,而不是对您创建的 XAML 文件的引用。

    【讨论】:

    • 你确定吗?例如,在将另一个活动粘贴或拖放到设计器时,可以添加运行时(非编译)活动。
    • 查看this blogpost 是否可以使用 DragDrop.DoDragDrop 做到这一点?什么是 DataObject?
    • 我指的是评论区尼克的评论
    • 它应该是一个完全限定的类型名称,因此 Type.GetType() 返回类型。这意味着活动应该是 .NET 类型并因此被编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多