Блог Сергея Байдачного

Мой блог о технологиях

Введение в SilverLight 4: правая кнопка мыши

3 комментария

Еще с выходом 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;
}

В коде выше я реализовал механизм создания нового контекстного меню, а также механизм обработки события, связанного с выбором пункта меню. Частично продублировал работу, уже реализованную в компоненте, но…

Ниже показан снимок экрана во время работы приложения.

image

Реклама

Written by Sergiy Baydachnyy

02.01.2010 в 21:51

Опубликовано в SilverLight

Tagged with

комментария 3

Subscribe to comments with RSS.

  1. Неплохо пишете. Регулярно, с огромным удовольствием читаю Ваши статьи.

    shelbo

    29.03.2010 at 03:17

  2. Странно. Вроде все просто. Но у меня обработчик MouseRightButtonDown не срабатывает при нажатии правой кнопкой. Вследствии чего, всеравно выскакивает контекстное меню с инфо о подключаемом модуле Silverlight.

  3. Все, проблема решена. Оказалось все дело было из-за прозрачного фона контрола. =)


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: