作業効率向上
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; }
以上です。いかがでしょうか?ぜひお試しください。
鈴木 章太郎