Silverlight 2 の新機能 - Deep Zoom(マウスホイール編)
前エントリでは、Deep Zoom の基本的な使い方について、ご紹介しました。ここで取り上げた Hard Rock Memorabilia では、マウスのホイールによってズーム(拡大縮小)を操作できるようになっています。このホイールの機能を自分のアプリケーションに実装するにはどうすればよいでしょう。
残念ながら、現在の Silverlight にはマウスホイールを扱う機能はありません。しかし、Live Search Maps がマウスホイールで地図の拡大縮小を行えるのですから、方法はあります。Live Search Maps では JavaScript を使っていますが、今回は Silverlight ですからマネージコードを使いたいでしょう。そのためには自分でホイールイベントを処理して、ブラウザの違いを吸収して……という処理が必要なのですが、Pete Blois さんという方が、ブログのエントリで、まさにこの処理のためのクラスを紹介されていました。どのような処理が必要かは、このソースコードを見るとわかります。
さて、このクラスを使うことで、昨日のプログラムを以下のように拡張できます。
using akadia;
......
Point lastPos = new Point(); // ホイールのためにマウスの最後の位置を保存しておく
public Page()
{
InitializeComponent();
// マウスホイールを扱うクラスのオブジェクトを生成し、ハンドラでズーム処理
new MouseWheelHelper(this).Moved += delegate(object sender, MouseWheelEventArgs e)
{
if (e.Delta < 0)
Zoom(lastPos, 0.8);
else
Zoom(lastPos, 1.2);
e.Handled = true;
};
}
また、OnMouseMove イベントハンドラの最後には、以下のコードを追加しておきます。
msi.ViewportOrigin = msi.ElementToLogicalPoint(p);
}
lastPos = e.GetPosition(msi); // マウスの最後の位置を保存
}
今回は、昨日よりも小さいイメージですが(写真としては1枚)、少し遊びの要素を入れてみました。試してみてください。
→「平井昌人を探せ!」