Latest News

  • Super Tower Defense Game
    Mar 10, 2010

    New to the games section is the new Super Tower Defense game. Defend your base from the ever advancing army of tanks, buggies...

  • New Rich Text Editor User Control
    Feb 19, 2010

    By popular request, here we present a re-usable User Control containing the Liquid RichTextBox along with the most common formatting functions included.

  • Silverlight 3 Controls V5.2.7 Released
    Feb 19, 2010

    This release includes several fixes for issues raised in the forum. The main improvement is to the RichTextBox which now provides access and methods to the document elements allowing...

  • Super Shoot Em Up Game
    Feb 04, 2010

    Added to the games section is the new Super Shoot 'Em Up game. Take control of a tank with your aim being to blow up your opposing tanks and collect all the powerups.

  • Silverlight 3 Controls V5.2.6 Released
    Feb 04, 2010

    This release includes some minor fixes for several forum posts. Please see the notes on the download page for full details on what has changed.

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.

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...