2010-06-22 96 views
7

我創建了一個ToggleButton來顯示和隱藏一塊用戶界面,並且我已將其Content發送到圖標。爲圖片內容設置切換按鈕的快捷鍵

我現在想要添加一個快捷鍵到ToggleButton,但我不確定如何處理而不綁定命令。由於我所做的只是綁定到IsChecked狀態,所以我不需要一個命令來執行任何其他功能,而創建一個空的一個似乎不正確。

這是我的ToggleButton,因爲它目前無功能,並且在按下指示的快捷鍵時沒有響應。

<ToggleButton ToolTip="Command History" 
       MinWidth="24" 
       IsChecked="{Binding IsShowHistoryChecked}" 
       Margin="7"> 
    <ToggleButton.InputBindings> 
     <KeyBinding Gesture="Ctrl+H" /> 
    </ToggleButton.InputBindings> 
    <Image Source="/Amuse;component/Images/ComHistory256.png" 
      Width="24" /> 
</ToggleButton> 

回答

11

的上切換按鈕本身InputBinding不會做的伎倆,但也有你的問題,有兩種很好的WPF的解決方案:

  1. 使用的RoutedCommand,更新模型。
  2. 註冊訪問密鑰。

爲什麼你InputBinding解決方案將無法工作

您已經定義目前是行不通的,因爲它沒有列出命令InputBinding。這是很容易創建切換按鈕命令,如下所示:

public void Execute(object parameter) 
{ 
    ((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked; 
} 

但是這不會達到你所期待的。即使按鈕未聚焦,也希望Ctrl-H切換按鈕。 InputBinding不會爲你完成,因爲它只在按鈕有焦點時才起作用。現在我將討論您可以使用的兩種解決方案。

選項1:使用的RoutedCommand,更新模型

WPF架構的全部意義在於,你永遠需要擺在首位,以「切換按鈕」:從概念中的所有鍵盤和鼠標操作WPF應該用於在模型或視圖模型中切換綁定屬性。 ToggleButton然後成爲接受鼠標點擊的機制,但不一定是唯一的。

你選擇你的「IsShowHistoryChecked」屬性的名稱表示你概念化您的視圖模型的方式的一個根本問題。您的視圖模型不應該圍繞視圖設計 - 而應該暴露諸如「ShowHistory」屬性之類的邏輯概念。該視圖可以將其綁定到CheckBox或ToggleButton,或者可以選擇其他機制,或者根本不公開它。數據綁定和視圖模型的重點在於,當您創建視圖模型時,您不關心實際視圖會是什麼樣子。實際上,在自動化單元測試期間,將沒有複選框,因此「IsShowHistoryChecked」顯然是一個錯誤的名詞。

所以我們可以說你已經正確地分離您的看法從您的視圖模型,你有一個「ShowHistory」屬性。首先在視圖模型中實現一個「ToggleShowHistory」命令,該命令在執行時切換ShowHistory屬性。現在,您只需在視圖級別將此命令分配給Ctrl-H的InputBinding,即可完成。即使ToggleButton完全從視圖中移除,InputBinding仍然會生效,並且Ctrl-H仍然可以工作。 Nirvanna。

選項2:註冊一個快捷鍵

Windows有鑰匙任意按鈕和標籤,這是「快捷鍵」的概念相關聯的標準機制。如果在ToggleButton上註冊一個訪問鍵「h」,按下Alt-H將切換按鈕,如果沒有TextBox或其他控件首先接受該按鈕,則只顯示H。

這是非常簡單的註冊代碼的訪問鍵:

AccessKeyManager.Register("h", togleButton); 

這將註冊「H」作爲訪問文本。現在,如果用戶在範圍內的任何地方按下Alt-H(或者如果不通過文本框處理,則顯示爲「h」),您的按鈕將切換。

您也可以在XAML中執行此操作。如果你出現在您的按鈕上的文字,只需訪問鍵字母前面使用下劃線:

<Button Text="Show _History" ... /> 

如果你正在展示的不僅僅是文本以外的東西,包括隱藏AccessText元素在你的按鈕內容:

<Button ...> 
    <Grid> 
    <AccessText Text="_h" Visibility="Collapsed" /> 
    <Image ...> 
    </Grid> 
</Button> 

如果您想知道,WPF沒有內置的機制來請求AccessKey註冊響應Ctrl而不是Alt,所以這不允許您將Ctrl-H設置爲訪問鍵。

+2

當能見度崩潰時,它似乎不適用於我。但我嘗試設置不透明度= 0,而且效果很好! – Haacked 2012-09-20 23:33:46