0

我在自定义 MVVM WPF 应用程序中重新托管 WF4 工作流设计器,按照 Maurices出色的博客文章的思路

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

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


编辑1:

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

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

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

截屏


编辑2:

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

选定的文本 -->在此处输入图像描述

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

上下文菜单:

上下文菜单

但主菜单:

主菜单

所以这不是菜单项的普遍问题,它与工作流设计器密切相关。在http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands.copy.aspx我们可以阅读

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

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


编辑3:

另一个非常奇怪的发现。I added the "Delete" Command to the menu, and this one does get enabled when an activity is selected. 单击此菜单项确实会从设计器表面删除活动。

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

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

4

2 回答 2

1

On DesignerView class you've a bunch of commands to use on top of Workflow Designer. The trick here is to set CommandTarget to current designer's DesignerView.

For example, having this on code-behind:

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; }
}

You would bind to commands like this:

<MenuItem Command="{Binding CopyCommand}" CommandTarget="{Binding CurrentDesignerView}"/>
<MenuItem Command="{Binding CutCommand}" CommandTarget="{Binding CurrentDesignerView}"/>
<MenuItem Command="{Binding PasteCommand}" CommandTarget="{Binding CurrentDesignerView}"/>
于 2013-06-25T10:34:30.577 回答
1

您应该能够对菜单项使用 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

于 2013-06-17T19:32:19.423 回答