locked
DataGridやTreeView等のコントロールに対して、マウスホイールでのスクロール方法 RRS feed

  • 質問

  • 皆様こんにちは。
    また初歩的な質問なのですが、タイトル通りの質問になります。
    色々とネットで探してみたのですが、VBのサンプルがなく非常に困っています。
    良い方法がありましたら、お願い致します。
    2009年10月30日 4:54

すべての返信

  • DataGridやTreeViewのMouseWheelイベントあたりに以下のコード書けばいけると思います~
    TreeViewとDataGridで動きを確認しました。
    ちなみにC#で書いたのをVBになおしてコンパイルしてないので、エラーがあるかもしれませんが、使うクラスとコードのイメージだけでも。

    Dim peer As FrameworkElementAutomationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(CType(sender, UIElement))
    var scroll = CType(peer.GetPattern(PatternInterface.Scroll), IScrollProvider)
    ScrollAmount amount = ScrollAmount.NoAmount
    If (e.Delta < 0) Then
        amount = ScrollAmount.SmallIncrement
    Else
        amount = ScrollAmount.SmallDecrement
    End If
    scroll.Scroll(ScrollAmount.NoAmount, amount)





    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年10月31日 18:21
  • 2、3行目がC#のままですかね?
    Dim scroll As IScrollProvider = CType(peer.GetPattern(PatternInterface.Scroll), IScrollProvider)
    Dim amount As ScrollAmount = ScrollAmount.NoAmount

    失礼しました。

    2009年11月2日 6:09
  • > 2、3行目がC#のままですかね?
    ですです^^;

    修正、ありがとうございます。多分全部VBのコード↓

    Dim peer As FrameworkElementAutomationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(CType(sender, UIElement))
    Dim scroll As IScrollProvider = CType(peer.GetPattern(PatternInterface.Scroll), IScrollProvider)
    Dim amount As ScrollAmount = ScrollAmount.NoAmount
    If (e.Delta < 0) Then
        amount = ScrollAmount.SmallIncrement
    Else
        amount = ScrollAmount.SmallDecrement
    End If
    scroll.Scroll(ScrollAmount.NoAmount, amount)

    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年11月3日 0:53
  • お世話様です。
    返事が遅くなって大変に申し訳ございません。
    いただいたサンプルソースをSilverLight3で使ってみたのですが、色々と型が宣言されていない等があり、利用できませんでした。
    SilverLightは初心者のため、もう少し詳しく教えていただけないでしょうか?

    「DataGridやTreeViewのMouseWheelイベントあたりに以下のコード書けばいけると思います~」ということですが、
    いただいたサンプルソースを「~.xaml.vb」ファイル内に、関数を用意して記述すればいいのでしょうか?
    その関数をたとえば、「<data:DataGrid>」内の「MouseWheel」プロパティにセットすればいいのでしょうか?

    本当に初歩的な質問で大変に恐縮いたします。

    2009年11月4日 7:05
  • > いただいたサンプルソースをSilverLight3で使ってみたのですが、色々と型が宣言されていない等があり、利用できませんでした。
    どう使って、どうエラーが出たのか教えてください。最低でも、エラーメッセージをください。
    じゃないと、何の型がみつからないのか、判断しかねるので返答できません。

    後は、自力で見つける方法としては、同じ名前のクラスをMSDNで探して、Importsする方法もあります。

    > 「DataGridやTreeViewのMouseWheelイベントあたりに以下のコード書けばいけると思います~」ということですが、
    > いただいたサンプルソースを「~.xaml.vb」ファイル内に、関数を用意して記述すればいいのでしょうか?
    > その関数をたとえば、「<data:DataGrid>」内の「MouseWheel」プロパティにセットすればいいのでしょうか?
    ButtonのClickイベントと同じで、DataGridとかに、MouseWheelイベントが定義されています。
    <data:DataGrid MouseWheel="dataGrid_MouseWheel" />
    とでもして、dataGrid_MouseWheelあたりで右クリックして、Eを押せばイベントハンドラが作られると思います。
    もしくはMouseWheel=まで入力してTabあたりでもイベントハンドラが作られると思います。
    そのイベントハンドラ内に提示したコードを書くということです。

    何処までわかって何処までわからないのかわからないので、完全に返答しようとすると超大作の返答になってしまうため
    一度この回答で検討してみてください。
    その上で、もうちょっとわからない内容をしぼっていただければ、回答できると思います。

    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年11月4日 10:54
  • VBで実装するって趣旨からは外れますが、Silverlight.FXを使用することで少なくとも
    DataGridについてはマウスホイールによるスクロールができますよ。
    (TreeViewについては試してないので判りません)
    2009年11月5日 14:01
  • ご連絡が遅くなり大変に申し訳ございませんでした。
    教えていただきました通り、イベントハンドラを作成し、教えていただいたコードをそのイベントハンドラへコピーしました。
    下記の通りエラーになりました。

        Private Sub MouseWheelScroll(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs)
            Dim peer As FrameworkElementAutomationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(CType(sender, UIElement))
            Dim scroll As IScrollProvider = CType(peer.GetPattern(PatternInterface.Scroll), IScrollProvider)
            Dim amount As ScrollAmount = ScrollAmount.NoAmount
            If (e.Delta < 0) Then
                amount = ScrollAmount.SmallIncrement
            Else
                amount = ScrollAmount.SmallDecrement
            End If
            scroll.Scroll(ScrollAmount.NoAmount, amount)
        End Sub

    エラー内容:
    FrameworkElementAutomationPeer」→「型 'FrameworkElementAutomationPeer' が定義されていません。」
    IScrollProvider」→「型 'IScrollProvider' が定義されていません。」
    ScrollAmount」→「型 'ScrollAmount' が定義されていません。」
    e.Delta」→「'Delta' は 'System.Windows.RoutedEventArgs' のメンバーではありません。」
    ScrollAmount」→「名前 'ScrollAmount' は宣言されていません。」

    以上です。これは、何か参照の追加が必要なのでしょうか?

    何卒宜しくお願い致します。

    2009年11月24日 2:55
  • FrameworkElementAutomationPeerのMSDNライブラリへのリンクです。
    http://msdn.microsoft.com/ja-jp/library/system.windows.automation.peers.frameworkelementautomationpeer(VS.95).aspx

    必要なアセンブリはSystem.Windows.dllなので、通常追加の参照はいりません。
    どの名前空間に含まれているか、リンク先に書かれているのでImportsしてください。
    恐らく、それでエラーが消えると思います。(別の型についても同様です)

    因みに、型名でGoogle検索や、MSDNライブラリを検索すると、いっぱつで上記リンクのページが出てくると思うのですが、どこらへんに躓いていましたか??
    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年11月24日 8:41
  • お世話様です。
    貴重なご連絡ありがとうございました。
    MSDNからエラーになっているものがどの名前空間に含まれるか?調べまして、下記の通りにソースを修正しました。

        Private Sub MouseWheelScroll(ByVal sender As Object, ByVal e As MouseWheelEventArgs)
            Dim peer As Windows.Automation.Peers.FrameworkElementAutomationPeer = Windows.Automation.Peers.FrameworkElementAutomationPeer.CreatePeerForElement(CType(sender, UIElement))
            Dim scroll As Windows.Automation.Provider.IScrollProvider = CType(peer.GetPattern(Automation.Peers.PatternInterface.Scroll), Windows.Automation.Provider.IScrollProvider)
            Dim amount As Windows.Automation.ScrollAmount = Windows.Automation.ScrollAmount.NoAmount
            If (e.Delta < 0) Then
                amount = Windows.Automation.ScrollAmount.SmallIncrement
            Else
                amount = Windows.Automation.ScrollAmount.SmallDecrement
            End If
            scroll.Scroll(Windows.Automation.ScrollAmount.NoAmount, amount)
        End Sub

    ですが、上記下線の部分で、下記のエラーが発生し、何のことか?わかりません。
    これはどのようにしたらエラー回避できるのでしょうか?

    <エラー内容>
    「エラー 1 Option Strict On で 'System.Windows.Automation.Peers.AutomationPeer' から 'System.Windows.Automation.Peers.FrameworkElementAutomationPeer' への暗黙的な変換はできません。」

    以上、皆様お力をください。宜しくお願い致します。

    2009年11月25日 3:03
  • 明示的にキャストするとどうなりますか?
    CTypeなんか使って

    # というかVBの基礎の本なりWeb上の連載なりを一読してからしたほうがいいと思います。
    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年11月25日 3:43
  • お世話様です。
    何とかマウスホイールでのスクロールができました。
    ありがとうございました。
    また何かあったらご教授ください。
    本当にありがとうございました。

    2009年11月25日 6:13
  • 結局何が駄目だったんですか??
    教えていただけると嬉しいのです。
    かずき Blog:http://blogs.wankuma.com/kazuki/
    2009年11月25日 7:06
  • お世話様です。
    結局、色々とサイトを見まして、
    xaml.vbファイルの先頭に記載されている「Option Strict On」を「Option Strict Off」にしたところ、
    できるようになりました。
    2009年11月25日 8:10