Интересно, что для таких, вроде бы, привычных вещей как меню по нажатию правой кнопки мыши, в silverlight нет специальных классов. Но это не проблема, сейчас вы сами в этом убедитесь. Вот что в итоге получится:
Начнем. Итак, напишем простенький XAML:
<UserControl x:Class="RightButtonContext.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="Auto" Height="Auto">
<Canvas x:Name="LayoutRoot" Background="GreenYellow">
<TextBlock Text="NO" x:Name="myTextBlock" />
<!-- Меню -->
<StackPanel Visibility="Collapsed" x:Name="menu" Width="100">
<Button Content="Кликни меня!!"/>
<Button Content="Или меня!"/>
<Button Content="О разработчиках"/>
</StackPanel>
</Canvas>
</UserControl>
Открываем .cs файл и пишем следующее:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
//Необходимо добавить пространство имен,
//в котором содержатся классы для взаимодействия
//с HTML документом
using System.Windows.Browser;
namespace RightButtonContext
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
//Присоединяем обработчик для
//события нажатия правой кнопки мыши
HtmlPage.Document.AttachEvent("oncontextmenu",
this.OnContextMenu);
//Обработчик для события опускания
//левой кнопки мыши
this.MouseLeftButtonDown +=
new MouseButtonEventHandler(Page_MouseLeftButtonDown);
}
void Page_MouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
menu.Visibility = Visibility.Collapsed;
}
private void OnContextMenu(object sender,
HtmlEventArgs e)
{
//Назначаем текст для отображения
//в textblock, в данном случае
//координаты курсора
myTextBlock.Text = "Позиция курсора: "
+ e.OffsetX + "," + e.OffsetY;
//Устанавливаем координаты появления меню
menu.SetValue(Canvas.TopProperty, (double)e.OffsetY);
menu.SetValue(Canvas.LeftProperty, (double)e.OffsetX);
//Делаем меню видимым
menu.Visibility = Visibility.Visible;
//Предотвращаем стандартное событие,
//т.е. появление меню плагина
e.PreventDefault();
}
private void OnPageClick(object sender,
HtmlEventArgs e)
{
//Делаем меню невидимым
menu.Visibility = Visibility.Collapsed;
}
}
}
Также нужно сменить атрибут плагина windowless на true. Открываем .aspx файл с СЛ контентом, находим тег <asp:Silverlight /> и добавляем строчку Windowless="true":
<asp:Silverlight ID="Xaml1" Windowless="true"
runat="server" Source="~/ClientBin/RightButtonContext.xap"
MinimumVersion="2.0.30523" Width="100%" Height="100%" />
На этом все. Можно тестировать! Самое интересное, что вы можете отреагировать на нажатие как угодно! Хоть на другой сайт перейти ;)