2010-05-27 54 views
0

我有一個從Canvas派生的自定義畫布。它包含幾個ApplicationCommandsNew/Open/Save等加入這樣的 -在Canvas中使用WPF命令不起作用

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設置爲主窗口,但這也不起作用。

爲什麼會發生這種情況,以及如何確保新菜單按鈕始終處於啓用狀態?

回答

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)); 
    } 
0

問題是,一旦您的按鈕和畫布在層次結構上方的某個位置共享邏輯焦點範圍(很可能是您的窗口),某些菜單中啓動的命令永遠不會到達您的畫布。

如果您有您希望收到你的所有命令只是一個畫布,只要綁定您的按鈕CommandTarget畫布:

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

注意ICommand標有TypeConverterAttribute該字符串轉換,如「新建」 ApplicationCommands.New因此您不必使用x:Static標記擴展名。

對於菜單/工具欄級別的所有按鈕,您可以在一個位置使用Style

但是,如果您有多個畫布,並希望您的命令被針對目前重點之一,你必須做兩件事情:

  1. 確保你的畫布(或在其控制)具有Focusable="True"
  2. 通過設置FocusManager.IsFocusScope="True"來限制工具欄的邏輯焦點範圍(或任何用於按鈕的容器)。一些容器,如Menu,或ToolBar默認啓用。這樣,一旦命令路由算法達到範圍,它就會將其重定向到當前具有鍵盤焦點的元素。