WPF路由命令隧道

时间:2015-03-10 11:55:56

标签: c# wpf routed-commands

我想在我的WPF应用程序中实现一个路由到用户控件的路由命令。

我的理解是路由命令(如路由事件)可以在可视树中上下传播以找到适当的处理程序,但是我找不到如何执行此操作的简单示例。

创建在定义它的同一可视树节点内处理的路由命令没有问题。

请有人提供一个简单的解释或示例,演示如何连接路由命令,以便在可视树下方的节点中处理。

更新: 我的用例是我有一些功能,我想在一个标签项中执行,实现为用户控件,我想通过键盘输入触发它。因此,我需要在主窗口中处理键盘输入,然后将命令传送到我的特定选项卡项。

由于

2 个答案:

答案 0 :(得分:0)

对于路由命令,我认为你不能因为与CanExecute紧密耦合而需要预览。

在WPF中,请考虑将EventManager用于路由事件。

在那里,您可以将路由定义为Bubbling,Tunneling或Direct。

示例:

public static readonly RoutedEvent ButtonColorChangedEvent = EventManager.RegisterRoutedEvent("ButtonColorChanged",RoutingStrategy.Bubble,typeof(DependencyPropertyChangedEventHandler),typeof(Shirt));

public event RoutedEventHandler ButtonColorChanged  {
    add {AddHandler(ButtonColorChangedEvent,value);}
    remove { RemoveHandler(ButtonColorChangedEvent, value); }
}

答案 1 :(得分:0)

路由从根到焦点元素隧道开始 如果没有指定cmd目标,则从焦点elmt冒泡到根目录。

经过挖掘和搜索,我得到了解决方案: 你必须设置“隧道停止和冒泡开始元素” 自己通过“CommandTarget”

public partial class Grid_Dienste : UserControl {

    public static Grid_Dienste   current     { get; set; }

    public Grid_Dienste()
    {

        current = this;

        ...

    // this is the prerequsite, works on singeltons

在上层节点/元素的xaml中,您可以引用“当前”

Command                     = "{Binding cmdLoad}"
CommandTarget               = "{x:Static local:Grid_Dienste.current}"

/>所以结论:隧道效应并不意味着从焦点到最底层 视觉,但从根本到焦点。