Пользовательские элементы управления (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 используя отладчик