Im WWW-Standard gibt es ja eigentlich gar keine rechte Maustaste. Es soll ja auch tatsächlich noch Menschen geben, die mit Mäusen auskommen die nur eine Taste haben.

Allerdings gibt es ja Tricks, die es dennoch erlauben.

In Silverlight 4 ist die Unterstützung der rechten Maustaste jetzt voll und ganz integriert. Man kann überall, außer dem Root-Element der Silverlight-Anwendung die rechte Maustaste abfangen.

void _rectangle_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    MessageBox.Show("Right Mouse Button Clicked");
}

Man muss lediglich im Eventhandler für das Ereignis “MouseRightButtonDown”, die “Handled”-Eigenschaft auf “true” setzen. Anschließend kann man an dieser Position nun ein eigenes Kontextmenü integrieren.

Für die Darstellung von Kontextmenüs kann jedes beliebige Steuerelement entwickeln. In meinem Fall, erstelle ich einfach ein StackPanel an Textblöcken, die angeklickt werden können. Um allerdings dieses Kontextmenü darzustellen, benötigt man ein Popup-Steuerelement. Dieses bekommt als Inhalt, das eigentliche Steuerelement.

Popup _popup;

void _rectangle_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
            
    MessageBox.Show("Right Mouse Button Clicked");
}

void MainPage_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    ClosePopup();
}

void MainPage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ClosePopup();
}

void _source_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    Point position = e.GetPosition(null);
    ShowContextMenu(position);
}

private void ClosePopup()
{
    if (_popup != null)
    {
        _popup.IsOpen = false;
        _popup = null;
    }
}

private void ShowContextMenu(Point position)
{
    if (_popup != null)
    {
        _popup.IsOpen = false;
        _popup = null;
    }

    StackPanel sp = new StackPanel();
    sp.Background = new SolidColorBrush(Colors.LightGray);
            
    sp.Children.Add(
        CreateMenuItem(
            "Kopieren", () => { ClosePopup(); CopyToClipboard(); }));

    sp.Children.Add(
        CreateMenuItem(
        "Ausschneiden", () => { ClosePopup(); CutText(); }));

    sp.Children.Add(
        CreateMenuItem(
        "Einfügen", () => { ClosePopup(); PasteText(); }));

    _popup = new Popup();
    _popup.Child = sp;
    _popup.Margin = new Thickness(position.X, position.Y, 0, 0);
    _popup.IsOpen = true;
}

delegate void MyDelegate();

private FrameworkElement CreateMenuItem(string caption, MyDelegate func)
{
    TextBlock tb = new TextBlock();
    tb.Text = caption;
    tb.MouseLeftButtonDown += (s, e) =>
        {
            func.Invoke();
        };
    return tb;
}