среда, 9 января 2013 г.

Привязка команд к сочетаниям клавиш

Маленький пример, на привязку команд к горячим клавишам. Пример, как ответ на вот этот вопрос с форумов MSDN.
Итак, давайте посмотрим, как настроить команды, чтобы при нажатии на кнопки клавиатуры, менялся бы цвет прямоугольника размещенного на форме.
Реализовывать, чтобы было интересно в рамках MVVM. Для этого в проект добавим класс с именем MainWindowViewModel. Команды будем реализовывать с помощью класса, который я описывал вот здесь.
Таким образом, класс будет содержать цвет прямоугольника и две команды. Ну и два метода, которые будут реализовывать логику команд. Т.к. изменение цвета в нашем классе, должен отслеживать визуальный интерфейс, нам придется сделать наш класс потомком DependencyObject, а свойство объявить как DependencyProperty. Подробнее зачем это нужно, можно посмотреть здесь. Вот его код:


public class MainWindowViewModel : DependencyObject

{
    public ICommand RedCommand { get; set; }
    public ICommand GreenCommand { get; set; }
    public SolidColorBrush RectangleColor
    {
        get { return (SolidColorBrush)GetValue(RectangleColorProperty); }
        set { SetValue(RectangleColorProperty, value); }
    }
    // Using a DependencyProperty as the backing store for RectangleColor.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RectangleColorProperty =
        DependencyProperty.Register("RectangleColor", typeof(SolidColorBrush), typeof(MainWindowViewModel), new UIPropertyMetadata(null));

    public MainWindowViewModel()
    {
        RectangleColor = new SolidColorBrush(Colors.Blue);
        RedCommand = new SimpleCommand(SetRed);
        GreenCommand = new SimpleCommand(SetGreen);
    }
    private void SetRed()
    {
        RectangleColor = new SolidColorBrush(Colors.Red);
    }

    private void SetGreen()
    {
        RectangleColor = new SolidColorBrush(Colors.Green);
    }
}
В конструктор, происходит инициализация начальным цветом и инициализируются команды.
Чтобы не правиль App.xaml, присвоение ViewModel-а в DataContext главной формы, произведем из нее же:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();           
    }
}

Ну с кодом на главной форме закончили, осталось привести разметку:
<Window x:Class="WpfApplication28.MainWindow"
        xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
        xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Rectangle Fill="{Binding RectangleColor}" Margin="20" />
    </Grid>
</Window>

Запустив приложение, мы, что естественно, увидим синий квадрат. Давайте добавим привязку команд из ViewModel к клавишам. Для этого, достаточно у нашего окна добавить вот такую разметку:
<Window.InputBindings>
    <KeyBinding Command="{Binding RedCommand}"
            Gesture="CTRL+R" />
    <KeyBinding Command="{Binding GreenCommand}"
            Gesture="CTRL+G" />
</Window.InputBindings>

Все, запускаем:

Комментариев нет:

Отправить комментарий