0

我有一个从Canvas. 它包含很少的ApplicationCommandslike New// etc. 添加这样Open-Save

this.CommandBindings.Add(new CommandBinding(ApplicationCommands.New, New_Executed, 
New_Enabled));

New_Enabled总是返回真。

此控件用于具有菜单栏的 wpf 项目中;新/打开/保存菜单按钮出现在此菜单栏中,它们的Command设置分别ApplicationCommand如下 -

<syncfusion:SimpleMenuButton
    x:Name="NewMenu"
    Icon="Images\New_Large.png"
    Label="New"
    IsEnabled="True"
    Command="{x:Static ApplicationCommands.New}"
    syncfusion:Ribbon.KeyTip="N">
</syncfusion:SimpleMenuButton>

当焦点存在时,命令可以正常工作,Canvas但一旦焦点转移到其他控件,新按钮就会被禁用。我试过设置CommandTarget到主窗口,但这也不起作用。

为什么会发生这种情况以及如何确保始终启用新菜单按钮?

4

2 回答 2

1

问题是,一旦您的按钮和画布在层次结构中的某个位置(很可能是您的窗口)共享逻辑焦点范围,在某些菜单中启动的命令就永远不会到达您的画布。

如果您只有一个想要接收所有命令的画布,只需将CommandTarget按钮绑定到画布:

...
Command="New"
CommandTarget="{Binding ElementName=TheCanvas}"
...

请注意,使用which 将字符串(如“New”)转换ICommand为标记,因此您不必使用标记扩展名。TypeConverterAttributeApplicationCommands.Newx:Static

您可以使用Style菜单/工具栏级别上的所有按钮在一个地方完成此操作。

但是,如果您有多个画布并希望将命令指向当前集中的一个,则必须做两件事:

  1. 确保您的画布(或上面的控件)具有Focusable="True"
  2. 通过设置来限制工具栏(或用于按钮的任何容器)的逻辑焦点范围FocusManager.IsFocusScope="True"。某些容器,例如 Menu,或ToolBar默认启用。这样,一旦命令路由算法到达范围,它将重定向到当前具有键盘焦点的元素。
于 2010-05-27T14:15:29.877 回答
0

@repka - 感谢您的回复;我已经尝试过使用画布名称,CommandTarget但它不起作用;仅当焦点位于画布上时,按钮才会启用,只要我单击窗口中的其他控件,它们就会被禁用。我也尝试使用IsFocusScope但结果相同。感谢命令名称字符串提示。

我不得不接受这种解决方法,尽管我对此不太满意 -

    public WindowMain()
    {
        InitializeComponent();

        //Add commnad bindings
        //Need to do this to keep New/Open/Save/Run buttons always enabled
        //ToDo:[AJ] Look for better solution then this
        this.CommandBindings.Add(new CommandBinding(ApplicationCommands.New, this.TheCanvas.New_Executed, this.TheCanvas.New_Enabled));
        this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, this.TheCanvas.Open_Executed, this.TheCanvas.Open_Enabled));
        this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Save, this.TheCanvas.Save_Executed, this.TheCanvas.Save_Enabled));
        this.CommandBindings.Add(new CommandBinding(RTDesignerCanvas.Run, this.TheCanvas.Run_Executed));
    }
于 2010-05-28T08:54:09.727 回答