Введение в SilverLight 4: правая кнопка мыши
Еще с выходом SilverLight 1, многие разработчики начали жаловаться на то, что не могут реализовать собственное контекстное меню при нажатии правой кнопки мыши в своем приложении. Действительно, правая кнопка полностью принадлежала SilverLight, а пользователь мог вызвать только контекстное меню, позволяющее получить доступ к настройкам встраиваемого компонента.
SilverLight 4 позволяет полностью переопределить поведение при нажатии правой кнопки. При этом программист вовсе не обязан отображать меню. Действие может полностью зависеть от самого приложения.
Чтобы переопределить работу правой кнопки мыши, достаточно выполнить два действия:
· Отключить существующее меню. Для этого нужно определить обработчик с события MouseRightButtonDown и установить свойство Handled в true. Это сигнализирует о том, что мы берем обработку события на себя и стандартное меню отображать не нужно;
· Определить вызов собственного меню (или любые другие действия) в обработчике события MouseRightButtonDown.
Расширим функционал предыдущего приложения, добавив контекстное меню к изображениям на панели. Для этого, расширим метод photoPanel_Drop, добавив следующий код:
img.MouseRightButtonDown += new
MouseButtonEventHandler(img_MouseRightButtonDown);
img.MouseRightButtonUp += new
MouseButtonEventHandler(img_MouseRightButtonUp);
Теперь реализуем сами обработчики событий. Начнем с MouseRightButtonDown:
void img_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
Как видно, тут нет ничего сложного. Мы просто нотифицируем SilverLight о перехвате события правой кнопки и подавляем отображение стандартного контекстного меню.
Теперь реализуем MouseRightButtonUp. Тут есть проблема, которая состоит в том, что если Вы хотите отобразить меню, то его нужно реализовать самостоятельно, или обратиться к сторонним разработчикам за дополнительными компонентами. В списке стандартных компонент и в SDK контекстное меню пока не реализовано. Я не стал разрабатывать меню сам, а установил тестовую версию с сайта: http://www.telerik.com. Тут Вы можете найти множество элементов управления для SilverLight 4.
Замечание. Никогда не используйте контекстное меню от Telerik так, как показано ниже. Компонент достаточно «умный», чтобы отобразить меню в качестве реакции на какое-то событие. Кроме того, этот элемент можно ассоциировать с любым интерфейсным элементом в момент его создания. Но, если сделать все правильно, то обработчик события для правой кнопки мыши и не понадобитсяJ Поэтому будем создавать меню именно при нажатии правой кнопки мыши и уничтожать его в «ручном» режиме.
private Image menuImage;
private RadContextMenu contextMenu;
void img_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
menuImage = (Image)sender;
if (contextMenu != null)
{
photoPanel.Children.Remove(contextMenu);
}
contextMenu = new RadContextMenu();
contextMenu.Items.Add("Delete");
contextMenu.Items.Add("Close Menu");
Point p=e.GetPosition(photoPanel);
contextMenu.Margin = new Thickness(p.X, p.Y, 0, 0);
photoPanel.Children.Add(contextMenu);
contextMenu.ItemClick += new
Telerik.Windows.RadRoutedEventHandler(menu_ItemClick);
}
void menu_ItemClick(object sender,
Telerik.Windows.RadRoutedEventArgs e)
{
RadRoutedEventArgs args = e as RadRoutedEventArgs;
RadMenuItem menuItem = args.OriginalSource as RadMenuItem;
string tag = Convert.ToString(menuItem.Header);
switch (tag)
{
case "Delete":
photoPanel.Children.Remove(menuImage);
photoPanel.Children.Remove(contextMenu);
break;
case "Close Menu":
photoPanel.Children.Remove(contextMenu);
break;
}
contextMenu = null;
}
В коде выше я реализовал механизм создания нового контекстного меню, а также механизм обработки события, связанного с выбором пункта меню. Частично продублировал работу, уже реализованную в компоненте, но…
Ниже показан снимок экрана во время работы приложения.
Неплохо пишете. Регулярно, с огромным удовольствием читаю Ваши статьи.
shelbo
29.03.2010 at 03:17
Странно. Вроде все просто. Но у меня обработчик MouseRightButtonDown не срабатывает при нажатии правой кнопкой. Вследствии чего, всеравно выскакивает контекстное меню с инфо о подключаемом модуле Silverlight.
Svyatoslav Pankratov (@Svat_P)
06.08.2011 at 11:48
Все, проблема решена. Оказалось все дело было из-за прозрачного фона контрола. =)
Svyatoslav Pankratov (@Svat_P)
06.08.2011 at 11:59