Главная » Silverlight » Колесико мыши

0

В наше время на большинстве компьютеров мышь оснащена колесиком. Разработчик приложения может использовать этот факт, запрограммировав реакцию на поворот ко­лесика. Необходимо лишь убедиться в том, что реакция на поворот колесика — полез­ное дополнительное средство управления приложением, а не отвлекающая безделушка. Кроме того, нужно учитывать, что на многих компьютерах мышь не имеет колесика (на­пример, в ноутбуках). Кроме того, многие люди не пользуются колесиком просто пото­му, что не имеют такой привычки.

Текущая версия Silverlight генерирует событие MouseWheel только в браузерах Internet Explorer под управлением Windows. Кроме того, событие генерируется в приложениях Silverlight, выполняющихся за пределами браузера, потому что в данном сценарии брау­зер Internet Explorer используется неявно. А вот пользователям Firefox и Мае не повезло. Чтобы создать реакцию на поворот колесика для пользователей всех платформ и браузе­ров, нужно применить ряд трюков на основе кода JavaScript. Базовая идея состоит в уста­новке на входной странице HTML обработчика событий JavaScript, который прослушива­ет колесико. Когда пользователь поворачивает колесико, обработчик события выполняет необходимые операции. Более подробно этот процесс рассматривается в главе 14.

Посредством свойства MouseWheelEventArgs. Delta событие MouseWheel передает ба­зовую информацию о величине поворота относительно момента предыдущей генерации этого же события. Обычно каждый щелчок колесика при повороте (не путайте со щелч­ком при нажатии колесика) добавляет в Delta значение 120. Значение Delta положи­тельное при повороте колесика в сторону от пользователя и отрицательное — при пово­роте к пользователю.

Рассмотрим код примера, показанного на рис. 4.5. В данном случае пользователь может зумировать содержимое контейнера Grid, поворачивая колесико мыши.

Рис. 4.5. Зумирование содержимого контейнера с помощью колесика

В примере используются два элемента управления, рассмотренные в главе 3, — ScrollViewer и Viewbox. Элемент Viewbox управляет зумированием изображения, a ScrollViewer — панорамированием. Если контейнер не помещается в окне, путем панорамирования можно вывести на экран любую его часть. Ниже приведена разметка операций зумирования и панорамирования.

<UserControl x:Class="RoutedEvents.MouseWheelZoom" xmlns="http://schemas.microsoft.com/winfx/200б/хаml/

presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:toolkit=

"clr-namespace:System.Windows.Controls;assembly= System.Windows.Controls.Toolkit" MouseWheel="Page_MouseWheel">

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">

<toolkit:Viewbox x:Name="viewbox" Height="250"

Width="350">

<Grid Background="White" Height="250" Width="350">

</Grid> </toolkit:Viewbox>

</ScrollViewer> </UserControl>

Изначально элементу Viewbox присвоены жестко закодированные размеры содержи­мого Grid. Благодаря этому Viewbox на нуждается в инициализирующем масштабиро­вании. При первом запуске приложения решетка Grid имеет исходные размеры.

Когда пользователь поворачивает колесико, обработчик события MouseWheel считы­вает значение Delta и настраивает свойства Width и Height элемента Viewbox, сохра­няя пропорции. В свою очередь, элемент Veiwbox, увеличиваясь или уменьшаясь, авто­матически масштабирует все свое содержимое.

private void Page_MouseWheel(object sender, MouseWheelEventArgs e)

{

// Значение Delta выражено в единицах, кратных 120, // поэтому деление на 110 приводит к зумированию //с коэффициентом 1,09. Иными словами, один щелчок // приводит к увеличению или уменьшению на 9% double scalingFactor = (double)е.Delta / 110;

// Проверка направления поворота

if (scalingFactor > 0) {

// Увеличение элемента Viewbox viewbox.Width *= scalingFactor; viewbox.Height *= scalingFactor;

}

else {

// Уменьшение элемента Viewbox viewbox.Width /= -scalingFactor; viewbox.Height /= -scalingFactor;

}

}

Захват мыши

Обычно через короткое время после генерации события, состоящего в нажатии кнопки мыши, генерируется событие отпускания кнопки. Однако иногда оно может не произойти. Например, если пользователь нажмет кнопку на элементе, переместит ука­затель за пределы элемента и только после этого отпустит кнопку, элемент не сгенери­рует событие отпускания кнопки.

В некоторых ситуациях желательно получить извещение об отпускании кнопки, даже если указатель покинул область элемента. Для этого нужно захватить (capture) мышь, вызвав метод MouseCapture () соответствующего элемента. Метод MouseCapture () определен в базовом классе UIElement, поэтому он поддерживается всеми элементами Silverlight. После вызова метода элемент будет получать события MouseLeftButtonDown и MouseLeftButtonUp при каждом нажатии или отпускании кнопки до тех пор, пока режим захвата не будет отключен. Существует два способа отключения режима за­хвата. Во-первых, можно еще раз вызвать метод MouseCapture () и передать ему зна­чение null. Во-вторых, пользователь может отменить захват, щелкнув за пределами приложения: в окне другой программы, на меню браузера или на содержимом HTML этой же веб-страницы. Когда элемент теряет захват мыши, он генерирует событие LostMouseCapture.

Когда мышь захвачена элементом, другие элементы не получают события мыши. Это означает, что пользователь не может щелкнуть на кнопке, расположенной в другой части страницы, или щелкнуть на текстовом поле, чтобы присвоить ему фокус, и т.д. Захват мыши иногда используется для создания перемещаемых элементов и элементов с изменяемыми размерами.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии