Latest News

  • Silverlight Online Chat
    Jul 24, 2010

    Today we launch the new Silverlight Live Chat application demonstrating the Liquid RichTextBox and Emoticon replacements.

  • New Super Shoot Em Up 2 Game
    Jun 29, 2010

    Added to the Games section is the new Super Shoot 'Em Up 2 game. Take control of your tank with the aim to defeat the computer controlled opponents. Features all new weapons, levels and Battle Mode!

  • Silverlight 4 Controls V5.3.2 Released
    Jun 28, 2010

    This release contains several fixes raised in the forums.

  • New Sandmania Puzzle Game
    Jun 18, 2010

    Sandmania is the latest game from vectorlight, the aim of this game is to guide sand from the top of the screen to the various colored containers below.

  • New Moon Tower Defense Game
    May 29, 2010

    Added to the Games section is the new Moon Tower Defense game. Defend the Moon from the circling Aliens and Humans.

Creating a Context Menu

In Silverlight 2 detecting the right mouse click is not possible using the built-in functionality, this is where javascript comes in.  There is a helper class included in the Liquid Controls library 5.1.5 named MousePlus and this enables you to detect right mouse-clicks.

In this example here we build a simple TreeView and add a Popup Menu:

* It is important you have the following set in your Silverlight configuration HTML:

<param name="Windowless" value="true" />.


Implementing a Context Menu

Here is the XAML for this demonstration:

<UserControl x:Class="ContextMenu.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:liquidTreeView="clr-namespace:Liquid;assembly=Liquid.TreeView"
    xmlns:liquidMenu="clr-namespace:Liquid;assembly=Liquid.Menu"
    Width="400" Height="300">
    <Canvas x:Name="LayoutRoot" Background="White">
        <liquidTreeView:Tree x:Name="myTreeView" Canvas.Left="10" Canvas.Top="10" Width="200" Height="200" EnableLines="True" SelectionChanged="myTreeView_SelectionChanged">
            <liquidTreeView:Node Title="Root" Icon="images/folder.png" IconExpanded="images/folderOpen.png" IsExpanded="True">
                <liquidTreeView:Node Title="Item 1" Icon="images/pdf.png" />
                <liquidTreeView:Node Title="Item 2" Icon="images/pdf.png" />
                <liquidTreeView:Node Title="Item 3" Icon="images/pdf.png" />
                <liquidTreeView:Node Title="Item 4" Icon="images/pdf.png" />
                <liquidTreeView:Node Title="Item 5" Icon="images/pdf.png" />
            </liquidTreeView:Node>
        </liquidTreeView:Tree>

        <liquidMenu:Menu x:Name="contextMenu" Visibility="Collapsed" ItemSelected="contextMenu_ItemSelected">
            <liquidMenu:MenuItem ID="delete" Text="Delete" />
            <liquidMenu:MenuDivider />
            <liquidMenu:MenuItem ID="moveUp" Text="Move Up" />
            <liquidMenu:MenuItem ID="moveDown" Text="Move Down" />
        </liquidMenu:Menu>
    </Canvas>
</UserControl>


In the XAML we have our TreeView named myTreeView, this has a single Root node and some children.  We also have our Popup Context Menu name contextMenu, this contains three options, Delete, Move Up and Move Down.  You will see later on in the C# how these actions are handled.

It is important we are using a Canvas as our root element as we need to be able to position the Context Menu using absolute positioning.

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;

using Liquid;
using Liquid.Components;

namespace ContextMenu
{
    public partial class Page : UserControl
    {
        private MousePlus _mousePlus = new MousePlus();
        private Node _node = null;

        public Page()
        {
            InitializeComponent();

            _mousePlus.Setup(myTreeView);
            _mousePlus.RightMouseClick += new MousePlusEventHandler(_mousePlus_RightMouseClick);
        }

        private void _mousePlus_RightMouseClick(object sender, MousePlusEventArgs e)
        {
            _node = myTreeView.GetNodeAtPoint(e.Position);

            if (_node != null)
            {
                contextMenu.SetValue(Canvas.LeftProperty, e.Position.X);
                contextMenu.SetValue(Canvas.TopProperty, e.Position.Y);
                contextMenu.Show();
            }
        }

        private void contextMenu_ItemSelected(object sender, MenuEventArgs e)
        {
            if (e.Tag == null)
            {
                return;
            }

            switch (e.Tag.ToString())
            {
                case "delete":
                    _node.Delete();
                    break;
                case "moveUp":
                    _node.SwapPrevious();
                    break;
                case "moveDown":
                    _node.SwapNext();
                    break;
            }

            contextMenu.Hide();
        }

        private void myTreeView_SelectionChanged(object sender, TreeEventArgs e)
        {
            contextMenu.Hide();
        }
    }
}


The C# contains the important stuff here, in the constructor we make a call to the MousePlus.Setup() method, this registers the provided UIElement with the javascript event handler.  This means that if there is a right mouse-click detected the mouse coordinates are calculated relative to the UIElement you specify which in this case is the TreeView.

We also attach an event handler to the RightMouseClick event.  This works out the node the right-click occured over using the Tree.GetNodeAtPoint() method, we then position the Context Menu and show it.

Handling the menu events is a simple switch ... case block to perform our node editing operations.

Rate this page: 

1 Star 2 Star 3 Star 4 Star 5 Star
16 Ratings / 2.5 Average

Ultimate Gamers

  • 1 stig
  • 2 Gh0sT
  • 3 dhoz
  • 4 janso
  • 5 gaaslin
  • 6 RadiateLogic
  • 7 dan
  • 8 Haroldo
  • 9 bigblue531
  • 10 oussama

  • See the full chart here!

Silverlight Controls

  • Rich TextBox

    Create and edit rich content with this slick and expandable Rich TextBox...

  • TreeView

    This easy to use TreeView comes with drag and drop, sorting, searching and much more...

  • Context Menu

    You too can have cool popup context menus in your Silverlight applications...

  • Resizable Dialog

    Draggable and resizable popup dialogs are what serious Silverlight developers need...

  • Spell Checker

    Real-time spell checking in Silverlight? We did it first here...