比较来自世界各地的卖家的域名和 IT 服务价格

WPF MenuItem.CommandTarget

有人知道你可以使用它的财产 CommandTarget 上 MenuItem?
http://msdn.microsoft.com/en-u ... .aspx
:

使用C. RoutedCommand 团队的目的是对象,ON
导致事件 Executed 和 CanExecute. 如果一个
财产 CommandTarget 未指定,然后元素与键盘焦点
将被用作目标。

但是,在实施价值期间 CommandTarget 在命令执行处理程序中可以看出。 发件人是属于的窗口 CommandBinding. ExecutedRoutedEventArgs 完整链接到此菜单项的遥远祖先。

这里的目标是实现从多个不同网格上的各种不同上下文菜单执行的命令,列表中的所有命令都包含支持特定接口的元素。 他们的上下文菜单不同,但有一些常见的命令。 一般团队使用相同的处理程序 Executed 和 CanExecute 无论你点击什么,因为团队 "Foo" 做 "Foo". 处理程序计算所选项目适用于任何网格/您单击的列表,尝试将其带到界面并与他一起做某事,如果它具有此界面 /如果元素不支持此命令使用的接口,则禁用此命令。/. 如果我有 ContextMenu 或者 MenuItem 作为发件人,我可以得到 PlacementTarget 我知道用户按下了什么,但它仅适用于我定义 CommandBinding 定义 XAML ContextMenu,这意味着复制整个块 XAML 每个 ContextMenu, 使用命令的位置,并覆盖这些演示类中的每个呈现类中的处理程序。 这不是我想要维护的混乱。

当没有一个独立的原因时,似乎这是一种不仅仅是用一次或多次将它们关联的独立原因,而不是一次。 但据我所能判断,似乎 XAML 他希望你将处理器和目标联系在一起。 你能链接一次处理程序,然后潜入另一个目的吗?

UPDATE: 我通过将团队在静态团队课上,处理程序 - 在非称期课程中解决了这个问题 /主要想法并不重要/ 并写一个静态方法 Command.GetCommandBinding/command/, 它创建一个实例并返回 CommandBinding 对于您传递的命令。 因此,如果我想使用团队 Foo 在网格面板上,在设计师中代表面板生活的位置,我只是称之为:


Bar.CommandBindings.Add/Commands.GetCommandBinding/Commands.Foo//;


然后 Bar 作为执行的发件人传递 CanExecute 将其分配给Team属性时的命令事件 MenuItem, 属于 ContextMenu Bar.

我不能在绑定中 XAML, 因为处理程序必须是课程成员 View. 设计师投资这么多劳动似乎很奇怪,以帮助我们重用 NAMES 团队,同时使其如此痛苦地重用实际,例如 CODE 对于团队,但仍然。 这不是一个最愚蠢的事情 Microsoft, 而且最重要的是 rest 的 XAML 很棒 /IMHO/.

另一种解决方案:无论上下文菜单如何,请将菜单项确定为资源并重新使用所有菜单项。 这是B. Resources.xaml, 我可以在其他文件中启用哪个 XAML 作为统一词典。 事件处理程序正在进行中 Resources.cs. 消费者可以使用 GridContextMenu 或插入 CtxMenuItem_EmailDocument 在您自己的上下文中以同样的方式。


<menuitem command="{x:Static vw:Commands.EmailDocument}" x:key="CtxMenuItem_EmailDocument"/>
<menuitem.commandbindings>
<commandbinding canexecute="EmailDocument_CanExecute" command="{x:Static vw:Commands.EmailDocument}" executed="EmailDocument_Executed"></commandbinding>
</menuitem.commandbindings>
<contextmenu x:key="GridContextMenu" x:shared="true">
<!-- other items -->
<staticresource resourcekey="CtxMenuItem_EmailDocument"></staticresource>
<!-- other items -->
</contextmenu>


CommandTarget, 它似乎在按钮上展示了一个完全不同的行为。 无论是或者 CommandBindings 如果它们在单独的文件中或作为资源中定义,或者......任何东西,都会表现完全不同。
已邀请:

龙天

赞同来自:

所有写道 AndrewS, 是的,我只是想补充一点 CommandTarget 将会

发件人

执行 / CanExecute 事件。 能够处理团队, CommandTarget 需要 CommandBinding 对于正在考虑的团队。

最低限度示例:


<stackpanel>
<button command="Open" commandtarget="{Binding ElementName=TestTextBox}">Open</button>
<textbox x:name="TestTextBox">
<textbox.commandbindings>
<commandbinding command="Open" executed="CommandBinding_Executed"></commandbinding>
</textbox.commandbindings>
</textbox>
</stackpanel>

莫问

赞同来自:

CommandTarget-

这是

课程上的元素 CommandManager 开始路由 CanExecute 并将在关联命令是时执行事件 RoutedCommand. 因此,事实上,他不会被展示 - 要么是事件参数参数 CanExecute/执行实际上它可以是 OriginalSource, 但我不会依赖它,因为如果 CommandManager 重定向命令 /因为她介绍了一个新的 FocusScope 当你传递一棵树时/, 它将被重定向,而且 OriginalSource 为了 eventargs 对于重定向的事件,它将是重定向的元素。


通常你没有安装 CommandTarget 为了 RoutedCommands, 可以通过几种类型的元素处理 - 例如, ApplicationCommands 作为 Cut/Copy/Paste, 您希望最终用户互动,接收团队并回答它的控件在哪里。 但是,如果您有一个案例,无论最终用户专注于哪个元素,您都希望确保 RoutedCommand, 您安装了哪些用于此命令的属性 ICommandSource /在这种情况下 MenuItem/, 在元素的特定实例上执行,然后必须安装 CommandTarget 对于这个项目 /通常使用绑定 ElementName/.

编辑:

自从改变这个问题以来,我会补充我的答案。 如果你想处理 CanExecute 并表现某些 RoutedCommands 在某些类型的类上,那么您想做的就是使用类 CommandManager - 特别是,这是一种方法 RegisterClassCommandBinding - 注册您的全球处理程序 Execute/CanExecute 为您的特定 RoutedCommands.

涵秋

赞同来自:

只是为了录音
CommandTarget

在上下文中 a
MenuItem

设置属性
OriginalSource


ExecutedRoutedEventArgs

, 由处理程序获得
Executed


CanExecute

.

以便 "Target" - 这是 "Source"

/与骆驼大致相同的是由委员会创造的马/


Sender

, 如图所示 @EdPlunket,, 是绑定团队的地方 /就像我一样。
e.Source

实际上/.

所以回答原来的问题,
CommandTarget


MenuItem

作为参考处理程序传输
Executed


CanExecute

团队 args 活动 /
ExecutedRoutedEventArgs


CanExecuteRoutedEventArgs

/ 在他们的财产
OriginalSource

. 因此,您可以使用此链接来完成您喜欢的一切。

工作示例


CommandTarget


MenuItem

由选择管理 ComboBox

MainWindow.xaml


<window height="200" title="MainWindow" width="400" x:class="CommandTarget.MainWindow" xmlns="[url=http://schemas.microsoft.com/winfx/2006/xaml/presentation"]http://schemas.microsoft.com/w ... ot%3B[/url] xmlns:local="clr-namespace:CommandTarget" xmlns:x="[url=http://schemas.microsoft.com/winfx/2006/xaml">]http://schemas.microsoft.com/w ... gt%3B[/url]
<stackpanel x:name="RootPanel">
<stackpanel.commandbindings>
<commandbinding canexecute="{x:Static local:MainWindow.OnPauseCanExecute}" command="Pause" executed="{x:Static local:MainWindow.OnButtonPause}" x:name="Pause"></commandbinding>
</stackpanel.commandbindings>
<dockpanel>
<menu dockpanel.dock="Top">
<menuitem command="Pause" commandtarget="{Binding ElementName=Button2}" header="Click Me" x:name="Emitter"/>
</menu>
</dockpanel>
<stackpanel name="Buttons">
<togglebutton content="Button1" height="30" horizontalalignment="Stretch" x:name="Button1"></togglebutton>
<togglebutton content="Button2" height="30" horizontalalignment="Stretch" x:name="Button2"></togglebutton>
</stackpanel>
</stackpanel>
</window>


MainWindow.xaml.cs


using System;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Input;

namespace CommandTarget
{
public partial class MainWindow : Window
{
public MainWindow//
{
InitializeComponent//;
}

//PAUSE COMMAND
// Static, binding callbacks

// Executed
public static ExecutedRoutedEventHandler
OnButtonPause = /sender, e/ =>
{
e.Handled = ButtonPauseTarget/e, delegate/ToggleButton target/
{
if /!target.IsEnabled/ return false;
var flag = target.IsChecked ?? false;
target.IsChecked = !flag;
return true;
}/;
};

// CanExecute
public static CanExecuteRoutedEventHandler
OnPauseCanExecute = /sender, e/ => { e.CanExecute = true; };

// helper to extract the target from the event args
private static bool ButtonPauseTarget /RoutedEventArgs e,
Func<togglebutton, bool=""> ex/
{
var target = e.OriginalSource as ToggleButton;
if /target == null/ return false;
var handled = ex/target/;

return handled;
}
}
}


注意:团队 Pause - 它只是一个随机的选择,任何其他命令都支持的任何命令都不用于任何其他命令。

https://github.com/cool-blue-W ... -xaml
</togglebutton,>

要回复问题请先登录注册