web-dev-qa-db-ja.com

ListBoxの一番下までスクロールする方法は?

Winforms ListBoxをイベントの小さなリストとして使用しており、最後のイベント(下)が見えるようにそれを設定したい。 SelectionModeはnoneに設定されます。ユーザーはリストをスクロールできますが、最後までスクロールして開始することをお勧めします。

ScrollIntoViewEnsureVisibleなどのサポートの欠如を見て、ListBoxを継承するカスタムコントロールを作成する必要があると考えています。しかし、私はそこから何をすべきかわかりません。

いくつかのポインタ?

57
JYelton

TopIndex プロパティを適切に設定することで簡単にできると思います。

例えば:

int visibleItems = listBox.ClientSize.Height / listBox.ItemHeight;
listBox.TopIndex = Math.Max(listBox.Items.Count - visibleItems + 1, 0);
85
Jon

下にスクロール:

listbox.TopIndex = listbox.Items.Count - 1;

一番下までスクロールし、最後の項目を選択:

listbox.SelectedIndex = listbox.Items.Count - 1;

50
user1032613

これは私がWPF(.Net Framework 4.6.1)のために終わったものです:

Scroll.ToBottom(listBox);

次のユーティリティクラスを使用します。

public partial class Scroll
{
    private static ScrollViewer FindViewer(DependencyObject root)
    {
        var queue = new Queue<DependencyObject>(new[] { root });

        do
        {
            var item = queue.Dequeue();
            if (item is ScrollViewer) { return (ScrollViewer)item; }
            var count = VisualTreeHelper.GetChildrenCount(item);
            for (var i = 0; i < count; i++) { queue.Enqueue(VisualTreeHelper.GetChild(item, i)); }
        } while (queue.Count > 0);

        return null;
    }

    public static void ToBottom(ListBox listBox)
    {
        var scrollViewer = FindViewer(listBox);

        if (scrollViewer != null)
        {
            scrollViewer.ScrollChanged += (o, args) =>
            {
                if (args.ExtentHeightChange > 0) { scrollViewer.ScrollToBottom(); }
            };
        }
    }
}
1
Sean Vikoren