Silverlight 4におけるアプリケーション要件への挑戦 – Right Click Menu & Mouse Wheel

作業効率向上

Silverlight 4では、アプリケーションを開発する際、右クリック、マウスホイール、フルスクリーン時のキーボード入力の活用など、ユーザーの作業効率を高める機能を実装することができます。

右クリックメニュー

業務アプリケーションに必須の機能として、右クリックの実装が可能になったことは非常に重要です。 これまでのSilverlightのアプリケーション上で右クリックすると“Silverlight”というメニュー(設定項目)しか出てこなかったからです。実装方法については、下記のソースで処理を見てみましょう。

右クリックメニューの実装方法

 public MainPage()
{
    mediaElement.MouseRightButtonDown 
 += new MouseButtonEventHandler(MouseRightButtonDownHandler);
}
 
private void MouseRightButtonDownHandler(object sender, …
{
    e.Handled = true;       // ①
}
 
private void MouseRightButtonUpHandler(object sender, … 
{
    var menu = new MyCustomMenuControl(mediaElement);
    menu.Show(e.GetPosition(LayoutRoot));
  ・・・

① そのまま右クリックすると “Silverlight”のメニューが出てしまいますので、この段階でHandleして、当該メニューが出ないようにしておきます。

この後、MouseRightButtonDownの箇所で、自分で実装したメニューを出すというような処理を入れても良いですし、MouseRightButtonUpの箇所で、別のメニューを出すというような処理を入れても良いのですが、“ContextMenu”のコントロールは存在していない、という点には注意が必要です。

そこで、実装する必要がある訳ですが、この点で、参考になるソリューションとして、Silverlight 4 Training Kitにある前述のRichTextBoxソリューションで、この点を確認してみましょう。

image

  場所はC:\Silverlight4\Labs\RichTextBox\Source\Ex02\Endです。処理は下記の通りです。

ContextMenuの実装

 <MainPage.xaml.cs>
…
//Mouse Events BEGIN
private void mainPanel_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

private void mainPanel_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    MPContextMenu menu = new MPContextMenu(this);
    menu.Show(e.GetPosition(LayoutRoot));
}

private void rtb_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

private void rtb_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    RTBContextMenu menu = new RTBContextMenu(rtb);
    menu.Show(e.GetPosition(LayoutRoot));
}

ここでは個別のコントロールごとにMPContextMenuRTBContextMenuというコンテキストメニューを別クラスで準備して、それらをMouseRightButtonUp() 等のメソッドに各々割り当てて、メニューを出しています。各コンテキストメニュー実装の中身については、各々のクラスをご参照ください。

マウスホイールの利用

マウスホイールが利用できることも、業務アプリケーションでは必須の機能といえるでしょう。大きな表を閲覧したり、画像データをスクロールしたりするのに、非常に便利です。

実装方法に関しては、OnMouseWheel() というイベントがありますので、これを使って実装しましょう。下記がその例になります。

OnMouseWheel()イベントによるマウスホイール利用の実装

 private void OnMouseWheel(   object sender, MouseWheelEventArgs e)
{
    if (e.Delta > 0)
        slider_X.Value += slider_X.LargeChange;
    else
        slider_X.Value -= slider_X.LargeChange;
}

以上です。いかがでしょうか?ぜひお試しください。

鈴木 章太郎