Zrobiłem programowanie WPF i jedną rzeczą, której nigdy nie otrzymałem, był wzorzec poleceń. Każdy przykład wydaje się być wbudowany, edytować, wyciąć, wkleić. Czy ktoś ma przykład lub sugestię najlepszej praktyki dla niestandardowych poleceń?Niestandardowy przykład wzoru polecenia WPF
Odpowiedz
Ah ha! Pytanie, na które mogę odpowiedzieć! Po pierwsze, powinienem wspomnieć, że osobiście łatwiej mi było zdefiniować i podłączyć polecenia w kodzie niż w XAML. Pozwala mi to nieco bardziej elastycznie podpinać procedury obsługi poleceń niż wszystkie metody XAML.
Powinieneś dowiedzieć się, jakie polecenia chcesz mieć i do czego się odnoszą. W mojej aplikacji, obecnie mam klasę definiowania ważnych poleceń aplikacji tak:
public static class CommandBank
{
/// Command definition for Closing a window
public static RoutedUICommand CloseWindow { get; private set; }
/// Static private constructor, sets up all application wide commands.
static CommandBank()
{
CloseWindow = new RoutedUICommand();
CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
// ...
}
Teraz, ponieważ chciałem zachować kod wszyscy razem, przy użyciu kodu tylko podejście do poleceń pozwala mi umieścić następujące metody w Klasa powyżej:
/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
((Window)e.Parameter).Close();
}
/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = e.Parameter != null;
e.Handled = true;
}
Druga metoda może być nawet udostępniona innym poleceniom bez konieczności powtarzania go w każdym miejscu.
Po zdefiniowaniu takich poleceń można je dodać do dowolnego elementu interfejsu użytkownika. Poniżej, po załadowaniu okna, dodaję powiązania poleceń zarówno do Window i MenuItem, a następnie dodam powiązanie wejściowe do okna za pomocą pętli, aby zrobić to dla wszystkich powiązań poleceń. Parametrem, który jest przekazywany, jest Window self, więc powyższy kod wie, jakie okno spróbować zamknąć.
public partial class SimpleWindow : Window
{
private void WindowLoaded(object sender, RoutedEventArgs e)
{
// ...
this.CommandBindings.Add(
new CommandBinding(
CommandBank.CloseWindow,
CommandBank.CloseWindowExecute,
CommandBank.CanExecuteIfParameterIsNotNull));
foreach (CommandBinding binding in this.CommandBindings)
{
RoutedCommand command = (RoutedCommand)binding.Command;
if (command.InputGestures.Count > 0)
{
foreach (InputGesture gesture in command.InputGestures)
{
var iBind = new InputBinding(command, gesture);
iBind.CommandParameter = this;
this.InputBindings.Add(iBind);
}
}
}
// menuItemExit is defined in XAML
menuItemExit.Command = CommandBank.CloseWindow;
menuItemExit.CommandParameter = this;
// ...
}
// ....
}
Wtedy też później mieć obsługi zdarzeń dla zdarzeń WindowClosing i WindowClosed, ja polecam Ci dokonać faktycznej realizacji poleceń małych i generycznych, jak to możliwe. Podobnie jak w tym przypadku, nie próbowałem umieszczać kodu, który próbuje zatrzymać zamykanie okna, jeśli są niezapisane dane, zachowałem ten kod mocno wewnątrz zdarzenia WindowClosing.
Daj mi znać, jeśli masz dodatkowe pytania. :)
Rzeczą o XAML jest to, że jest ona dobra dla "prostych" programów, ale niestety nie działa dobrze, gdy chcesz robić takie rzeczy, jak funkcje udostępniania. Załóżmy, że masz kilka klas i interfejsów, z których wszystkie miały polecenia, które nigdy nie były wyłączone, musisz napisać metodę "CanAlwaysExecute" dla każdego Window lub UserControl! To po prostu niezbyt dobrze DRY.
Po przeczytaniu kilku blogów i kilku próbach dokonałem wyboru, aby zrobić XAML wyłącznie o wyglądzie, stylach, animacji i wyzwalaczach. Całe moje podpinanie programów obsługi zdarzeń i komendy jest teraz w tyle za kodem. :)
Innym sposobem przyzwyczajenia jest powiązanie wejścia, w celu ich przechwycenia, fokus musi znajdować się na obiekcie zawierającym wiązania wejściowe. Na przykład, aby uzyskać skrót, którego możesz użyć w dowolnym momencie (powiedz F1, aby otworzyć pomoc), to powiązanie wejścia musi być ustawione na obiekcie Window, ponieważ zawsze ma ono fokus, gdy twoja aplikacja jest Aktywna. Użycie metody kodu powinno ułatwić to zadanie, nawet po rozpoczęciu korzystania z kontrolek UserControl, które mogą chcieć dodać powiązania wejściowe do ich okna nadrzędnego.
I napisał o pęczek zasobów w WPF poleceń wraz z przykładu w ubiegłym roku http://blogs.vertigo.com/personal/alanl/Blog/archive/2007/05/31/commands-in-wpf.aspx
wklejanie tutaj:
Adam Nathan’s sample chapter on Important New Concepts in WPF: Commands
MSDN article: The Command Pattern In WPF
Keyvan Nayyeri: How to Add Commands to Custom WPF Control
Ian Griffiths: Avalon Input, Commands, and Handlers
MSDN Library: Commanding Overview
MSDN Library: CommandBinding Class
MSDN Library: Input and Commands How-to Topics
MSDN Library: EditingCommands Class
MSDN Library: MediaCommands Class
MSDN Library: ApplicationCommands Class
MSDN Library: NavigationCommands Class
MSDN Library: ComponentCommands Class
pochowano także w próbkach WPF SDK, jest ładny próbka na edycję RichTextBox który ja przedłużony. Znajdziesz go tutaj: RichTextEditor.zip
http://blogs.vertigo.com/personal/alanl/Blog/archive/2007/05/31/commands-in-wpf.aspx Ten link jest martwy :( – Drahakar
W wydaniu magazynu MSDN z września 2008 roku, Brian Noyes ma świetny artykuł na temat RoutedCommand/RoutedEvents !!!
Oto link: http://msdn.microsoft.com/en-us/magazine/cc785480.aspx
Link jest martwy ... – ardila
- 1. Tworzenie wzoru kreskowania w WPF
- 2. Wstrzykiwanie zależności przy korzystaniu ze wzoru polecenia
- 3. Niestandardowy kursor w WPF?
- 4. Google OAuth2 przykład wiersza polecenia
- 5. Wiązanie polecenia obrazu WPF
- 6. Polecenia WPF, jak zadeklarować polecenia poziomu aplikacji?
- 7. WPF - animacja sekwencyjna prosty przykład
- 8. Wiązanie polecenia WPF w DataTemplate
- 9. Przykład światowego przykładu zastosowania wzorca polecenia
- 10. WPF: Jak utworzyć niestandardowy panel sterowania?
- 11. Jakiego wzoru wzoru używa Codeigniter?
- 12. Zmiana koloru tła przycisku za pomocą wzoru MVVM w WPF
- 13. Niestandardowy automatycznego doboru WPF klasy panelu
- 14. Niestandardowy format daty w formacie WPF
- 15. Problem podczas korzystania z wzoru wzoru dekoratora
- 16. Problem związany z wiązaniem polecenia Command WPF
- 17. Parametr polecenia WPF w polu tekstowym
- 18. Wiele parametrów polecenia Obiekt przycisku wpf
- 19. Polecenia WPF a zdarzenia Zalety/wady
- 20. Polecenia WPF - Robiąc to bez kodu źródłowego
- 21. Parametr polecenia wpf z innego obiektu
- 22. Projekt wzoru PHP Doradztwo
- 23. gsub tylko część wzoru
- 24. Jak mogę odczytać niestandardowy skrót klawiaturowy od użytkownika w WPF?
- 25. Projekt wzoru dekoratora
- 26. Jak wykonać polecenia Vima w pliku, na przykład .vimrc?
- 27. Asynchroniczne polecenia MVVM
- 28. Wyszukiwanie powtarzającego się wzoru
- 29. Alternatywy dla wzoru singleton?
- 30. Implementacja wzoru dekoratora
Twój CanExecuteIfParameterIsNotNull zawiera jeden z moich przykrości domowych. Dlaczego nie tylko e.CanExecute = e.Parameter! = Null; – Ray
@Ray To nie było coś, o czym wiedziałem, że mogę zrobić! Dzięki za edycję Drew. :) – Nidonocu