ページ

2009年4月20日月曜日

[Silverlight] Silverlight.FX でマウス・ホイール対応にする

Silverlight はそのままではマウスホイールに対応していません。
自分で HTML 上のマウスホイールイベントを捕まえて処理してやる必要があります。
と言っても、HTML に JavaScript でイベントハンドラを書いたりする必要はありません。
Silverlight 内から HTML のイベントにアタッチできるので Silverlight 内で完結できます。
コード例は Silverlight Tip of the Day #23 ? How to Capture the Mouse Wheel Event などにあります。
ただ、このコード例はホイールの値を取り出してるだけで、Getting mouse wheel to vertically scroll a datagrid なんかにも 「で、DataGrid でスクロールしたいんだけど、このあとはどうやったらいいの?」 なんて質問があったりします。それに対して Sergey.Lutay さんが完全に動くコード例を載せてくれていますので、、、

って、あれ?リンク切れてる?
さがしたら見つけたので勝手にリンクしちゃいます。
Sergey.Lutay 氏の SkyDrive です。
WheelCtrlKey_withDG.zip
この例では DataGrid を ScrollIntoView() でスクロールしています。

また、Silverlight DataGrid & ListBox mouse scroll support では ListBox など内部に ScrollViewer を持つものと、DataGrid など IScrollProvider を持つものの両方の例が示されています。
完全に動くサンプルコードもダウンロードできます。
詳しくは見てませんが、かなりきちんと作りこまれてるみたいです。

■ で、やっと本題(^^;
MouseWheel Behavior for Silverlight
↑では Silverlight.FX を使って簡単にマウスホイール対応にできると紹介されています。
ScrollViewer と TextBox のコード例が示されていますが、試してみたところ DataGrid にもちゃんと対応してました。
やったのは↓だけ。

  1. Silverlight のプロジェクトの 「参照の追加」 で Silverlight.FX の binaries\Debug\Silverlight\SilverlightFX.dll を追加する。(もちろん Release でもいいです)
  2. XAML に
    <UserControl ...
        xmlns:fxui="clr-namespace:SilverlightFX.UserInterface;assembly=SilverlightFX"
    を追加。
  3. 同じく XAML の DataGrid のところに
    <data:DataGrid ...>
        <fxui:Interaction.Behaviors>
            <fxui:MouseWheelScroll />
        </fxui:Interaction.Behaviors>
    </data:DataGrid>
    を追加。

ほんとにこれだけでちゃんとマウスホイール対応になりました。
すばらしい。

ちなみに、ちょっと Silverlight.FX のソースを見てみたら以下のようなことをしてました。

IScrollProvider scrollProvider = null;

AutomationPeer automationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject); if (automationPeer != null) { scrollProvider = (IScrollProvider)automationPeer.GetPattern(PatternInterface.Scroll); }
if (scrollProvider == null) { ScrollViewer scrollViewer = GetChildScrollViewer(AssociatedObject); if (scrollViewer != null) { automationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(scrollViewer); if (automationPeer != null) { scrollProvider = (IScrollProvider)automationPeer.GetPattern(PatternInterface.Scroll); } } }

なるほど、「IScrollProvider を持ってるときはそれを使う。持ってないが ScrollViewer を持ってるときは ScrollViewer の IScrollProvider を使う」 とすることによって IScrollProvider で統一してスクロールできるんですね。

しかし、この Silverlight.FX っておもしろいなぁ。
添付プロパティを応用して外部から機能を拡張したりしてるんですね。
それについての解説は Silverlight Behaviors にあるようです。(読んでませんが)
ちなみに、Silverlight.FX には MouseWheelScroll と同じような感じで MouseTriger とか HoverEffect とかおもしろそうなものがいろいろ入ってます。
他にも Window とか盛りだくさんです。
けど、ドキュメントがみつかりません。ソースコードを読んでいくしかないのかなぁ(^^;
まぁ、まだバージョン 0.1.0.0 ですからね(^^


0 件のコメント:

コメントを投稿