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 に答える