2010-06-22 12 views
7

Utworzono ToggleButton, aby pokazać i ukryć fragment interfejsu użytkownika, a następnie wysłałem jego ikonę Content do ikony.Ustaw klawisz skrótu dla przycisku ToggleButton z zawartością obrazu

Chcę teraz dodać klawisz skrótu do ToggleButton, ale nie jestem pewien, jak to zrobić, nie wiążąc również polecenia. Ponieważ wszystko, co robię, wiąże się ze stanem IsChecked, nie potrzebuję żadnego polecenia do wykonania żadnej innej funkcji, a utworzenie pustej wydaje się niepoprawne.

Oto mój ToggleButton, ponieważ obecnie nie działa i nie odpowiada po naciśnięciu wskazanego klawisza skrótu.

<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> 

Odpowiedz

11

InputBinding na samej ToggleButton nie załatwi, ale istnieją dwa dobre rozwiązania dla swojego problemu WPF:

  1. użyć RoutedCommand który aktualizuje model.
  2. Zarejestruj klucz dostępu.

Dlaczego rozwiązanie InputBinding nie zadziała

InputBinding zdefiniowaniu obecnie nie działa, ponieważ nie wymienia polecenia. Łatwo jest utworzyć polecenie przełączające przycisk:

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

Jednak to nie doprowadzi do tego, czego szukasz. Chcesz, aby Ctrl-H przełączał twój przycisk , nawet gdy przycisk nie jest ustawiony na. InputBinding nie osiągnie tego dla ciebie, ponieważ działa tylko wtedy, gdy przycisk ma fokus. Omówię teraz dwa rozwiązania, z których możesz skorzystać.

Opcja 1: Użyj RoutedCommand który aktualizuje model

Istotą architektury WPF jest to, że nigdy nie będzie trzeba „włączyć przycisk” w pierwszej kolejności: koncepcyjnie wszystkie klawiatury i myszy działania w WPF powinien służyć do przełączania powiązanej właściwości w modelu lub modelu widoku. ToggleButton staje się po prostu mechanizmem akceptującym kliknięcia myszą, ale nie musi być jedynym.

Nazwa wybrana dla właściwości "IsShowHistoryChecked" wskazuje na podstawowy problem w sposobie konceptualizacji modelu widoku. Twój model widoku nie powinien być zaprojektowany wokół widoku - powinien raczej eksponować logiczne pojęcia, takie jak właściwość "ShowHistory". Widok może powiązać to z CheckBox lub ToggleButton, lub może wybrać inny mechanizm lub może go wcale nie ujawnić. Punktem wiążącym dane i modele widoku jest to, że podczas tworzenia modelu widoku nie obchodzi się, jaki będzie rzeczywisty widok. W rzeczywistości podczas automatycznego testowania jednostkowego nie będzie pola wyboru, więc "IsShowHistoryChecked" będzie wyraźnie mylące.

Załóżmy, że odpowiednio oddzieliłeś swój widok od modelu widoku i masz właściwość "ShowHistory". Najpierw zaimplementuj komendę "ToggleShowHistory" w modelu widoku, która po uruchomieniu przełącza właściwość ShowHistory. Teraz wszystko co musisz zrobić, to przypisać temu poleceniu InputBinding z Ctrl-H na poziomie widoku i gotowe. Nawet jeśli ToggleButton zostanie usunięty z widoku, funkcja InputBinding będzie nadal działać, a Ctrl-H nadal będzie działał. Nirvanna.

Opcja 2: rejestracja dostępu klucza

Windows ma standardowy mechanizm kojarzenia klucze z dowolnych przycisków i etykiet, które jest „kluczem dostępu” pojęcie. Jeśli zarejestrujesz klawisz dostępu "h" na ToggleButton, naciśnięcie Alt-H spowoduje przełączenie przycisku, a więc po prostu H, jeśli nie masz TextBox lub innego kontrolera, zaakceptuj go jako pierwszy.

To bardzo proste, aby zarejestrować klucz dostępu w postaci kodu:

AccessKeyManager.Register("h", togleButton); 

ten rejestruje „h” jako tekst dostępu. Teraz, jeśli użytkownik naciśnie Alt-H w dowolnym miejscu w zasięgu (lub zwykłym "h", jeśli nie jest obsługiwany przez TextBox), przycisk będzie przełączał.

Można to również zrobić w XAML. Jeśli pokazując tekstu w przycisku, wystarczy użyć podkreślenie przed literą klucza dostępowego:

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

jeśli pokazuje coś innego niż tylko tekst, to ukryty element, AccessText w treści przycisk:

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

Jeśli zastanawiasz się, WPF nie ma wbudowanego mechanizmu, aby zażądać, aby rejestracje AccessKey reagowały na Ctrl zamiast Alt, więc to nie pozwoli Ci ustawić Ctrl-H jako klucz dostępu.

+2

Gdy widoczność jest zwinięta, nie wydaje się, że działa dla mnie. Ale próbowałem ustawić Opacity = 0 zamiast tego i to działało świetnie! – Haacked

Powiązane problemy