InputBinding na samej ToggleButton nie załatwi, ale istnieją dwa dobre rozwiązania dla swojego problemu WPF:
- użyć RoutedCommand który aktualizuje model.
- 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.
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