我在自定义MVVM WPF应用程序中重新托管WF4工作流设计器,与Maurices excellent blog post
一致但我无法弄清楚如何将剪切,复制,粘贴,撤消,重做等应用程序命令(我想在主菜单中公开)绑定到设计器。像Ctrl-X这样的键盘绑定开箱即用,但我想让我的MenuItem做同样的事情。这里有什么帮助吗?
选择编辑 - >主菜单栏中的复制应将当前选定的活动复制到剪贴板,就像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:
另一个非常奇怪的发现。我在菜单中添加了“删除”命令,并且在选择活动时启用了 。单击此菜单项确实会从设计器表面删除活动。
<MenuItem Header="_Delete" Command="Delete" />
因此它与剪切/复制/过去命令完全不一致......
答案 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