Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2009年09月04日

Silverlight3でマウスホイールスクロール

SilverlightのDataGridやListBoxなどのScrollableなコントロールは標準ではホイールスクロールに対応していません。
Silverlight3ではMouseWheelイベントが追加されたということなので、マウスホイールによるスクロール実装が簡単にできるようになったのかと思いきや、実際にやってみるとこれがなかなかうまくいきません。

将来的にはBlend3でBehaviorを設定するだけで簡単に実現できるようになりそうな雰囲気ですが、Blend3もベータ版の状態だし、現状ではホイールスクロール用のBehavior自体も提供されていない様子。

というわけで、海外サイトを中心に徘徊した挙句、書いてみたコードを晒しておきます。
(主に参考とさせていただいたのはこちら)
Imports System.Windows.Automation.Peers
Imports System.Windows.Automation.Provider

Private Sub LayoutRoot_MouseWheel(ByVal sender As Object, _
ByVal e As System.Windows.Input.MouseWheelEventArgs) Handles LayoutRoot.MouseWheel

For Each el In VisualTreeHelper.FindElementsInHostCoordinates( _
e.GetPosition(Nothing), CType(sender, FrameworkElement))
Dim peer = FrameworkElementAutomationPeer.FromElement(el)
If peer Is Nothing Then
peer = FrameworkElementAutomationPeer.CreatePeerForElement(el)
End If
If peer IsNot Nothing Then
Dim scroll As IScrollProvider = _
CType(peer.GetPattern(PatternInterface.Scroll), IScrollProvider)
If scroll IsNot Nothing Then
If scroll.VerticallyScrollable Then
If e.Delta < 0 Then
scroll.Scroll(Automation.ScrollAmount.NoAmount, _
Automation.ScrollAmount.SmallIncrement)
ElseIf e.Delta > 0 Then
scroll.Scroll(Automation.ScrollAmount.NoAmount, _
Automation.ScrollAmount.SmallDecrement)
End If
Exit For
End If
End If
End If
Next

End Sub
コイツを丸々コピペするだけで、Scrollableなコントロールがホイールスクロール対応になるはず。(バグがあったらすみません)

通常、SLの画面(UserControl)のルートエレメントとして定義することになるであろう「LayoutRoot」グリッドのMouseWheelイベント内で、現在のマウスポインタがあるポジションのエレメントを取得し、それがスクロール可能なエレメントであった場合、ホイールの回転に従って上下にスクロールさせる仕組みです。

まぁ、こんなコードはいずれ不要になってくれることを希望するわけですが…。

[ posted by ken ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/434-d1b36105
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。