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ソリューションで、この点を確認してみましょう。
場所は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));
}
ここでは個別のコントロールごとにMPContextMenuとRTBContextMenuというコンテキストメニューを別クラスで準備して、それらを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;
}
以上です。いかがでしょうか?ぜひお試しください。
鈴木 章太郎