3

我们正在使用一个重新托管的设计器(当前为 WF 4.0),其中包含许多自定义活动,它们都有自定义设计器。对于其中的一堆,我想在设计模式下将条目添加到设计器的上下文菜单中。我说的是这个菜单:

在此处输入图像描述

例如,对于 XAML 编码的活动,我希望有一个“开源...”条目,它将将该特定活动的 XAML 源加载到新设计器中。为此,我必须将条目添加到菜单中,并在单击时确定单击了哪个活动。这两部分我都不清楚。我怎样才能做到这一点?

在 WF 3 中有ActivityDesignerVerb类可以做到这一点。在 WF 4 中似乎有workflowDesigner.Context.Services.Publish<ICommandService>(...),但我不知道如何使用它向上下文菜单添加自定义操作。我怎样才能做到这一点?

这个 SO 条目显示了内部调试器命令的一些内容,但我想添加一个全新的命令。

4

2 回答 2

3

在主机中解决

如果您想在工作流设计器主机上解决这个问题,而不是在单个活动中,这样做非常简单直接。

当您托管工作流设计器并创建工作流设计器时,您可以简单地访问其ContextMenu属性并修改其Items集合。

var wfd = new WorkflowDesigner();
wfd.ContextMenu.Items.Add(new MenuItem() { Header = "Hello", Command = yourCommand, });

如果您想为每个活动提供不同的菜单项,您可以订阅该SelectionChanged事件:

wfd.Context.Items.Subscribe<Selection>(SelectionChanged);

然后实现自己的逻辑:

private void SelectionChanged(Selection selection)
{
    // Remove old menu item
    if (oldMenuItem != null)
    {
        wfd.ContextMenu.Items.Remove(oldMenuItem);
        oldMenuItem = null;
    }

    var modelItem = selection.PrimarySelection;

    if (selection.SelectionCount == 1 && modelItem != null)
    {
        // Get activity type
        var activityType = modelItem.ItemType;

        var menuItem = new MenuItem() { /* ... */ };
        wfd.ContextMenu.Items.Add(menuItem);
        oldMenuItem = menuItem;
    }
}

在活动设计器中解决它

如果无论工作流设计器 UI 托管在何处,都希望始终显示特定的上下文菜单项,则可以在活动设计器 XAML 中创建自定义项:

<sap:ActivityDesigner.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Show" Command="{Binding YourCommand}"/>
    </ContextMenu>
</sap:ActivityDesigner.ContextMenu>
于 2017-01-10T13:10:58.527 回答
0

好的,您需要做的就是在您的自定义活动上实现 ICommand 接口。

因此,例如 - 从客户活动类公开自定义命令属性,然后在构造函数中将委托事件应用于命令处理程序 -

/// <summary>
/// Custom activity
/// </summary>
public partial class CustomActivityDesigner
{
    /// <summary>
    /// Command used to display a dialog at design time
    /// </summary>
    public ICommand ShowCustomDialog{ get; set; }

    public CustomSchedulerDesigner()
    {
        InitializeComponent();

        ShowCustomDialog= new DelegateCommand(x => 
            //Do some stuff here that will display your dialog
            //you may want to consider passing the `this.ModelItem`
            //to your dialog so it can then interact with the ModelTrees etc
            //for example
            var dialog = new MyDialog(this.ModelItem);
            dialog.ShowDialog();
        );
    }

}

最后,通过活动设计器 xaml 将新命令连接到 UI。

<sap:ActivityDesigner.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Show" Command="{Binding ShowCustomDialog}"/>
    </ContextMenu>
</sap:ActivityDesigner.ContextMenu>
于 2016-04-07T09:42:14.090 回答