さて、Silverlight3を日本語環境で開発できるようになって一週間くらいたちますが、ちらほらとSilverlight3関連の記事とかを見るようになってきました。
動画配信すげーよ!とか、SEOばっちりだぜ!とか色々新機能が紹介されてますが、個人的に一番嬉しいのがマウスホイールのイベントが拾えるようになったことだったりします。
Silverlight2では、マウスホイールのイベントを拾おうと思ったら、どうしてもJavaScriptでやってるみたいな泥臭い感じのことをしないといけませんでした。
参考:http://blogs.wankuma.com/kazuki/archive/2009/04/20/171690.aspx
そのため、Silverlight2でホイールスクロール対応させるのは、ちょびっと大変な感じでした。
Silverlight.FXみたいに、うまいことラッピングされているライブラリもありますが、これも裏で泥臭いことをしてたりします。さらに、Silverlight3の新機能のOut of Browserでブラウザ外に出ちゃうと使えないという悲しい動きもしたりします。
そこらへんとの兼ね合いもあってかSilverlight3では標準でMouseWheelイベントがあります。
(ただ、相変わらずホイールスクロールは自動ではしてくれないです。でも、ホイールスクロールの機能を作りこむためにHTMLの世界に踏み込まなくてもいい。)
超簡単にですが、動きを見てみようと思います。
適当にSilverlightApplicationを作成して、MainPage.xamlにテキストボックスを1つ置いて、改行を受け付けるようにして、マウスホイールイベントを受け取るようにします。
<UserControl x:Class="SilverlightApplication7.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
<TextBox AcceptsReturn="True" MouseWheel="TextBox_MouseWheel"></TextBox>
</Grid>
</UserControl>
コードビハインドで、マウスホイールの様子をデバッグ出力に出しています。
using System.Diagnostics;
using System.Windows.Controls;
using System.Windows.Input;
namespace SilverlightApplication7
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void TextBox_MouseWheel(object sender, MouseWheelEventArgs e)
{
Debug.WriteLine(sender + " mouse wheel : " + e.Delta);
}
}
}
デバッグ実行して、テキストボックスの上でマウスのホイールをくるくる回すと、Visual Studioの出力に以下のようなものが表示されるはずです。
System.Windows.Controls.TextBox mouse wheel : 120
System.Windows.Controls.TextBox mouse wheel : 240
System.Windows.Controls.TextBox mouse wheel : 120
System.Windows.Controls.TextBox mouse wheel : 120
System.Windows.Controls.TextBox mouse wheel : -120
System.Windows.Controls.TextBox mouse wheel : -120
後は、この値を見てスクロールを制御できればホイールスクロールが作れる!!
それはまた別の話で。お昼休みが終わってしまうorz