0

から派生したカスタム キャンバスを使用していCanvasます。/ /などApplicationCommandsのようなものはほとんど含まれていません。このように追加されています -NewOpenSave

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

New_Enabled常に true を返します。

このコントロールは、メニュー バーを持つ 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

問題は、ボタンとキャンバスが階層の上位のどこか (ほとんどの場合ウィンドウ) で論理的なフォーカス スコープを共有すると、一部のメニューで開始されたコマンドがキャンバスに届かないことです。

すべてのコマンドを受け取りたいキャンバスが 1 つしかない場合CommandTargetは、ボタンをキャンバスにバインドするだけです。

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

マークアップ拡張機能を使用する必要がないように、「New」などの文字列を に変換ICommandする でマークされていることに注意してください。TypeConverterAttributeApplicationCommands.Newx:Static

Styleメニュー/ツールバーのレベルにあるすべてのボタンを使用して、1 か所で実行できます。

ただし、複数のキャンバスがあり、現在フォーカスされているキャンバスにコマンドを向けたい場合は、次の 2 つのことを行う必要があります。

  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 に答える