将剪切/复制/粘贴命令绑定到MVVM应用程序中的重新托管设计器

时间:2013-06-17 18:27:41

标签: wpf workflow-foundation-4 workflow-rehosting

我在自定义MVVM WPF应用程序中重新托管WF4工作流设计器,与Maurices excellent blog post

一致

但我无法弄清楚如何将剪切,复制,粘贴,撤消,重做等应用程序命令(我想在主菜单中公开)绑定到设计器。像Ctrl-X这样的键盘绑定开箱即用,但我想让我的MenuItem做同样的事情。这里有什么帮助吗?

选择编辑 - >主菜单栏中的复制应将当前选定的活动复制到剪贴板,就像Ctrl-C一样。这有可能吗?


编辑1:

如果我只是添加一般的应用程序命令,如

MenuItem Header="Cu_t" Command="Cut" />

我得到一个包含始终禁用项目的菜单:

Screenshot


编辑2:

一般命令绑定似乎没问题。如果我在文本框中选择一些文本(在我的应用程序中的设计器表面之外的某个位置,甚至在活动中),菜单项都会启用并按预期工作:

Selected text - > enter image description here

但是如果我选择整个活动并希望剪切/复制..它,菜单项都会变暗 - 尽管键盘绑定按预期工作,并且在内置上下文菜单中启用了项目:

上下文菜单:

Context menu

但主菜单:

Main menu

因此菜单项不是一般问题,它与工作流设计师严格相关。在http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands.copy.aspx,我们可以阅读

  

如果未设置CommandTarget,则命令的目标是具有键盘焦点的元素。如果具有键盘焦点的元素不支持粘贴命令或当前无法执行粘贴命令(例如剪贴板为空),则MenuItem将显示为灰色。

在这种情况下,工作流设计师具有焦点,可以执行剪切,但仍然显示为灰色。这是否意味着工作流设计器根本不支持应用程序命令?


编辑3:

另一个非常奇怪的发现。我在菜单中添加了“删除”命令,并且在选择活动时启用了 。单击此菜单项确实会从设计器表面删除活动。

<MenuItem Header="_Delete" Command="Delete" />

因此它与剪切/复制/过去命令完全不一致......

2 个答案:

答案 0 :(得分:1)

DesignerView类上,您可以在Workflow Designer上使用大量命令。这里的诀窍是将CommandTarget设置为当前设计者的DesignerView

例如,在代码隐藏时使用此代码:

public DesignerView CurrentDesignerView
{
    get { return WorkflowDesigner.Context.Services.GetService<DesignerView>(); }
}

public ICommand CopyCommand
{
    get { return DesignerView.CopyCommand; }
}

public ICommand CutCommand
{
    get { return DesignerView.CutCommand; }
}

public ICommand PasteCommand
{
    get { return DesignerView.PasteCommand; }
}

你会绑定到这样的命令:

<MenuItem Command="{Binding CopyCommand}" CommandTarget="{Binding CurrentDesignerView}"/>
<MenuItem Command="{Binding CutCommand}" CommandTarget="{Binding CurrentDesignerView}"/>
<MenuItem Command="{Binding PasteCommand}" CommandTarget="{Binding CurrentDesignerView}"/>

答案 1 :(得分:0)

您应该能够将OOTB应用程序命令用于菜单项。

<MenuItem Header="Edit"> 
    <MenuItem Command="ApplicationCommands.Copy"/> 
    <MenuItem Command="ApplicationCommands.Cut"/> 
    <MenuItem Command="ApplicationCommands.Paste"/> 
    <MenuItem Command="ApplicationCommands.Undo"/> 
    <MenuItem Command="ApplicationCommands.Redo"/> 
    <MenuItem Command="ApplicationCommands.SelectAll"/>
</MenuItem>

http://blogs.technicise.com/how-to-add-copy-cut-paste-etc-for-edit-menu-in-wpf/

修改

这是关于命令绑定的一篇很好的msdn文章。您可以在后面的代码中定义CanExecute(CanExecuteHandler)方法。 http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Close"
                    Executed="CloseCommandHandler"
                    CanExecute="CanExecuteHandler"
                    />
</Window.CommandBindings>
<StackPanel Name="MainStackPanel">
    <Button Command="ApplicationCommands.Close" 
            Content="Close File" />
</StackPanel>

此外,只有某些控件内置了对应用程序命令的支持。

  

WPF中的许多控件都内置了对某些命令的支持   在命令库中。例如,TextBox支持许多   应用程序编辑命令,如粘贴,复制,剪切,重做和撤消。   应用程序开发人员无需执行任何特殊操作   这些命令可以使用这些控件。如果TextBox是   执行命令时命令目标,它将处理   命令使用内置于控件中的CommandBinding。

http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands.copy.aspx

以下是Microsoft的一些示例代码。 http://msdn.microsoft.com/en-us/library/ms753300.aspx