Пользовательские элементы управления (User Controls) в Silverlight - События клавиатуры

ОГЛАВЛЕНИЕ

События клавиатуры

Для реализации функциональности "быстрых клавиш" нам необходимо осуществить реакцию на события клавиатуры, полученные элементом StackPanel, в частности событие KeyDown. Файлы помощи Silverlight указывают, что событие KeyDown является пузырьковым событием.

Мы можем начать с простого и отвечать на любые события клавиатуры путем заполнения формы адресом компании Microsoft. Мы присвоим классу защищенный объект (private) Address, для которого мы определим память в конструкторе. Мы также будем обрабатывать стандартное событие Loaded, которое вызывается при загрузке страницы.

public partial class Page : UserControl
{
    private Address theAddress;
    public Page()
    {
        InitializeComponent();
        theAddress = new Address();
        Loaded += new RoutedEventHandler(Page_Loaded);
    }

В Page_Loaded мы хотим создать обработчик события для KeyDown при регистрации любого события клавиши для любого элемента управления в пределах табличной сетки, которую, как вы помните, мы назвали AddressGrid в Page.xaml следующим образом,

<Grid x:Name="AddressGrid" Background="Bisque" >

При сохранении страницы Page.xaml данный определитель мгновенно будет доступен в фоновом коде, и мы можем получить доступ к его свойствам и событиям, включая событие KeyDown,

 

Рисунок 4-4. Определение в .xaml для последующего использования в фоновом коде

void Page_Loaded(object sender, RoutedEventArgs e)
{
    AddressGrid.KeyDown += new KeyEventHandler(AddressGrid_KeyDown);
}

Visual Studio 2008 предложит вам создать программную оболочку для обработчика события, что нам как раз и нужно. На данный момент мы осуществим реакцию на KeyDown,  всё равно для какой клавиши - мы заполним форму адресом компании Microsoft.

Данный подход можно назвать по-разному, но я уверен что изменив меньше вещей между тестовыми запусками, нам придется исследовать меньше кода в случае, если он не будет работать.

void AddressGrid_KeyDown(object sender, KeyEventArgs e)
{
    theAddress.Location = "Microsoft";
    theAddress.Address1 = "One Microsoft Way";
    theAddress.Address2 = "Building 10";
    theAddress.City = "Redmond, WA 98052";
    this.DataContext = theAddress;
}

Обратите внимание на то, что мы завершаем событие установкой DataContext страницы в только что заполненный объект Address. Результатом будет объект для привязки к элементам управления. При запуске приложения ничего не произойдет. Щелкните в пределах любого из текстовых полей и затем нажмите любую клавишу и форма будет заполнена. Легче всего будет нажать клавишу shift!

 

Рисунок 4-5. Нажатие любой клавиши выполнит заполнение формы

Заполнение форм нажатием комбинации клавиш

Нам необходимо заполнить форму адресом компании Address при нажатии Control-M, и адресом музея при нажатии Control-C. Нам необходимо кое-что поменять в обработчике события,

void AddressGrid_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.C && Keyboard.Modifiers == ModifierKeys.Control)
    {
        theAddress.Location = "The Computer History Museum ";
        theAddress.Address1 = "No Longer in Boston!";
        theAddress.Address2 = "1401 N. Shoreline Blvd";
        theAddress.City = "Mountain View, CA 94043";
    }
    if (e.Key == Key.M && Keyboard.Modifiers == ModifierKeys.Control)
    {
        theAddress.Location = "Microsoft";
        theAddress.Address1 = "One Microsoft Way";
        theAddress.Address2 = "Building 10";
        theAddress.City = "Redmond, WA 98052";
    }
    this.DataContext = theAddress;
}

Небольшое изменение ширины текстовых полей в Page.xaml (изменив Width с 500 на 600) и метода установки свойства Width стиля TextBox в App.xaml,  (изменив значение 250 на 350) и у нас будет достаточно места для помещения фразы "The Computer History Museum"

<Style TargetType="TextBox" x:Key="TextBoxStyle">
    <Setter Property="Width" Value="350" />
</Style>

Запустите приложение и в любом месте формы нажмите Control-C, а затем Control-M, и после опять Control-C. Весело, не правда ли?

 

Рисунок 4-6. Форма после нажатия Control-C

Установив точку  остановки в месте чтения клавиши, вы сможете увидеть проверку на нажатие комбинации Control-C либо наведя курсор на значения, либо просмотрев окошко Watch (или QuickWatch),

 

Рисунок 4-7. Просмотр содержимого EventArgs используя отладчик