2023年3月27日月曜日

VB WPF ListBox ScrollBar を自動で操作

ListBox ですが、
ScrollBar を設けるケースも多いと思います。
以下に、VB.net WPF で ScrollBar の表示位置を Code 側から操作する事を書きたいと思います。
実は、難しい一面 も持ち合わせた方法 なのですが ... 。


通常は、
項目数が多くて、画面内に狙った項目が入ら無い場合が多いと思うのですが、
此処では違います。

項目が長過ぎて、枠外に飛び出すケースなのです。
そして、肝心な(見たい)部分は 其の飛び出した最後部付近 にあったりします。 

実行時、横 ScrollBar を操作して、
頻繁に、項目の後ろ側を覗く事が多い。
そんな時は、 最初から、後ろ側を出してよ! となりますね。

でも、簡単には いかない! ので、
此れ迄、我慢して来ました。

重い腰を上げ、
調べ出すと、 例は ... 少ない ですねぇ。
例に依って、C# は豊富な事が多いのに、それすら ... 。
VB.net は 全滅 に近いかも。
きっと、調べ方が悪いのでしょうね。

何とか、参考になりそうなものを見付け、弄って見ました。

   そうそう、
   此の例では、昔、VB.net + VS2013 で書いてあった 奴 ですので、
   同じ環境下で熟します。


おおっ、
此れは 高等テクニック の 様相 です。
とても、 自分では 思い付か無い  思い付け無い 切り口 ですね。

WPF の 根幹 が分かっていなければ、
こんな事は 思い付きませぬ。
凄いね、 凄い人 がいるもんだ!。  ;)


            'Add Reference UIAutomationProvider & UIAutomationTypes > Import System.Windows.Automation
            Dim peer = Automation.Peers.ItemsControlAutomationPeer.CreatePeerForElement(Me.ListBox1)
            'Dim scrollProvider = peer.GetPattern(Automation.Peers.PatternInterface.Scroll)
            Dim scrollProvider = CType(peer.GetPattern(Automation.Peers.PatternInterface.Scroll), Automation.Provider.IScrollProvider)

            scrollProvider.Scroll(
                Automation.ScrollAmount.LargeIncrement,
                Automation.ScrollAmount.NoAmount)


実は、此の ListBox は 常時 非表示で、
必要に応じて、現れる様に作ってあります。

ですから、
表示切替の部分に 上記 Code を挿入しました。

  組み込んだ後の挙動は、
  表示される表示データの分量に左右される様で、
  横 ScrollBar の後部に移動しますが、
  必ずしも最後(終端)を示す訳では無い様です。
  
  後述の資料では 大きなデクリメントでスクロールするように指定 とあり、
  PgUp (/ PgDn) キー 或いは Bar の空白部分をクリック と同等 と書いてあります。

  冒頭で、難しい一面 と書いたのは、
  此の挙動に依る 表示 の バラツキ が生じる事、 なのです。
  まぁ、眼を瞑る事にしましょう。
 
    因みに、
    項目数が 0 の場合に、此の部分を通過させる様な 作り だと、
    当然、データが無いのにスクロールさせる事になり、
    エラーを吐きますので、
    転用する場合には、組み込む場所や方法等に、ご留意下さい。

  Code の 解説 は省きます。
  何たって、 良くは分かっていないのですから ... 。  X(

  scrollProvider.Scroll( の 2つの引数 は、
  横 縦 の順での ScrollAmount 列挙型 になります。
  参考: https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.automation.scrollamount?view=netframework-4.8

  似た様な Method で、
  ScrollVertical(ScrollAmount)
  ScrollHorizontal(ScrollAmount)
  もありますね。
  また、
  SetScrollPercent(Double, Double)
  もあったりします。


今迄は、表示させた後で、
大抵のケースで、
おもむろに、手動スクロール ポン! だったのです。

此れからは、 おまかせ で、自動スクロール!。
いやぁ、 便利なものです。
多少の 気難しい挙動 には 眼を瞑って ... 。  ;)



0 件のコメント:

コメントを投稿