Команды горячих клавиш для Silverlight в MVVM?

Я пытаюсь запускать команды на основе нажатий клавиш в Silverlight. Насколько я понимаю, вы не можете использовать AccessKey или AcceleratorKey в Silverlight. Также похоже, что может быть полезно прикрепленное свойство InputBindings тоже не работает.

Я начал искать в других местах. Похоже, Prism - это способ заставить команды работать в Silverlight, поэтому я это проверил. Однако у них есть только обработчик Click, который даже не является полезной отправной точкой для настройки ключевых команд.

Мне просто не хватает какой-то части Prism? Или есть хороший стандартный способ работы с горячими клавишами с помощью MVVM Silverlight?


person RandomEngy    schedule 25.09.2009    source источник
comment
Мне очень любопытно узнать, есть ли на это ответ.   -  person Jeremiah    schedule 26.09.2009


Ответы (3)


Похоже, вы ищете "бескодовый" способ MVVMish для обработки события KeyUp / KeyPress / KeyDown.

Вариант №1: Prism.
Вы упомянули, что он поставляется только с командой Click. Однако вы можете добавить свои собственные подключенные DP, чтобы включить команды для любого события, которое вы хотите (например, KeyUp / KeyDown / KeyPress).

Если вы ищете образец этого, у Кори есть хороший образец для событий ToggleButton.Checked / Unchecked.
http://www.85turns.com/2009/06/24/togglebutton-command-for-prism/

<ToggleButton x:Name="ToggleButton1" 
            customCommands:Checked.Command="{Binding CheckedCommand}"
            customCommands:UnChecked.Command="{Binding UnCheckedCommand}"
        Margin="8,8,0,8" Content="Check me"
        />

Кроме того, у Эрика Морка есть отличное видео, которое дает вам хороший обзор команд и того, как создать собственную команду Attached DP. http://development-guides.silverbaylabs.org/Video/Prism-Commands

Вариант № 2: триггеры смешивания
Expression Blend SDK поставляется с триггерами и поведением, которые соответствуют тому, что вы пытаетесь сделать.
Примеры смешивания codeplex поставляется с EventTrigger, который вы можете использовать:

<i:EventTrigger EventName="Click">
      <si:InvokeDataCommand Command="{Binding ShoppingCart.CheckOutCommand}"/>
</i:EventTrigger>

Или вы можете создать свой собственный триггер для событий нажатия клавиш и делать там все, что захотите. Вот пример:
http://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

person JustinAngel    schedule 29.09.2009
comment
Я поддерживаю ответ Джастина. Я создал вложение команды KeyDown / KeyUp, используя вариант № 2, и обрабатываю PageUp / PageDown и другие горячие клавиши в своем приложении SL. Это действительно хорошо работает. Я передаю код клавиши через параметр команды, поэтому моя команда может правильно обрабатывать коды клавиш. Хорошая идея - создать множество этих прикрепленных команд. Их легко написать, и их легко использовать везде, где они вам нужны. - person Brian Genisio; 29.09.2009
comment
Что касается варианта №1: модель Prism хорошо работает для событий, которые не нуждаются в дополнительной информации, но не работает, если вы хотите иметь варианты одного и того же события, например разные ключи в KeyDown. Его реализация полагается только на одно присоединенное свойство для каждого элемента, но для работы с горячими клавишами вам понадобится несколько прикрепленных свойств для одного и того же элемента. Реализация поведения присоединенного свойства не позволяет этого. Вариант №2 / Брайан: В идеале, разве вы не хотите, чтобы горячие клавиши указывались в представлении, а не в реализации команды? - person RandomEngy; 29.09.2009
comment
Мне очень нравится этот образец поведения наложения. Вот там один умный парень;) - person Michael Brown; 09.01.2010

Вы имеете в виду Ctrl + v или что-то подобное? Я видел следующий пример в сайт MSDN.

void Canvas_KeyUp(object sender, KeyEventArgs e)
{
    //check for the specific 'v' key, then check modifiers
    if (e.Key==Key.V) { 
        if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) {
        //specific Ctrl+V action here
        }
    } // else ignore the keystroke
}
person Tzury Bar Yochay    schedule 28.09.2009
comment
Я ищу шаблон команды MVVM. Я уже знаю, как подключить его к программному обеспечению. - person RandomEngy; 28.09.2009

набор инструментов MVVM содержит интересный класс CommandReference, который позволяет связывать InputBindings с командами ViewModel. Я не уверен, что это работает с Silverlight, но вы можете попробовать ...

Хорошо, как указал RandomEngy, в Silverlight нет InputBindings ...

Однако я думаю, что вы можете использовать привязанное поведение. Это способ «привязать» событие к команде ViewModel. У Марлона Греча есть хорошая реализация здесь

person Thomas Levesque    schedule 28.09.2009
comment
Я не верю, что в Silverlight есть InputBindings. - person RandomEngy; 28.09.2009
comment
Вы абсолютно правы, я забыл эту деталь ... Меня всегда удивляло, когда я вижу ограничения Silverlight по сравнению с WPF - person Thomas Levesque; 29.09.2009