14

垂直リストビューの最後の項目が常に表示されるようにスクロールしようとしていますが、 ListView.ScrollIntoView() は機能しません。

私が試してみました:

button1_Click(object sender, EventArgs e)
{

            activities.Add(new Activities()
            {
                Time = DateTime.Now,
                Message = message
            });

            ActivityList.ItemsSource = activities;

            // Go to bottom of ListView.
            ActivityList.SelectedIndex = ActivityList.Items.Count;
            ActivityList.ScrollIntoView(ActivityList.SelectedIndex);
}

私も試しました:

ActivityList.ScrollIntoView(ActivityList.Items.Count)ActivityList.ScrollIntoView(ActivityList.Items.Count + 1);しかし何も機能していません。

助けてください。これは本当に迷惑です。この場合、ドキュメントはあまり役に立ちません。

4

11 に答える 11

20

メソッドが項目オブジェクトを期待しているときに、インデックスを渡しています。選択したアイテムまでスクロールするには、これを試してください。

ActivityList.ScrollIntoView(ActivityList.SelectedItem);

最後の項目までスクロールしたい場合は、これを使用できます

ActivityList.ScrollIntoView(ActivityList.Items[ActivityList.Items.Count - 1]);
于 2013-06-05T14:30:17.250 に答える
4

少なくとも私が経験していることから、同様の「解決策」の問題はActivityList.ScrollIntoView(ActivityList.Items[ActivityList.Items.Count - 1]); 、ListBoxに同じアイテムが複数回含まれている場合、最初に見つかったもの、つまり最低のインデックスにジャンプすることです。そのため、入力した項目のインデックスは気にせず、その項目を探して最初のものを選択します。

これに対する解決策はまだ見つかっていませんが、現在取っているアプローチは、項目の追加ではなく挿入です。元のポスターの場合、次のようになると思います。

activities.Insert(0, new Activities()
        {
            Time = DateTime.Now,
            Message = message
        });

またはおそらく:

ActivityList.Items.Insert(0, new Activities()
        {
            Time = DateTime.Now,
            Message = message
        });

これにより、すべての新しいエントリが一番上に挿入されるため、ScrollIntoView を呼び出す必要さえありません。

于 2015-06-23T09:56:30.750 に答える
3

古い投稿ですが、ここでの回答はどれも私のケースでは機能しなかったため、実装を追加したいと思います。私はここで解決策を見つけました: ?forum=wpf][1]

((INotifyCollectionChanged)lvLogs.Items).CollectionChanged += ListView_CollectionChanged;

private void ListView_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    ScrollToEnd(this.lvLogs);
}

private void ListView_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if ((e.Action == NotifyCollectionChangedAction.Add) && (e.NewItems != null))
            {
                try 
                {
                    ScrollToEnd(this.lvLogs);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "Error updating list view", MessageBoxButton.OK, MessageBoxImage.Error);
                }

            }
        }

public void ScrollToEnd(ListView _ListView)
{
    ScrollViewer _ScrollViewer = GetDescendantByType(_ListView, typeof(ScrollViewer)) as ScrollViewer;
    _ScrollViewer.ScrollToEnd();
}

public Visual GetDescendantByType(Visual element, Type type)
{
    if (element == null) return null;
    if (element.GetType() == type) return element;
    Visual foundElement = null;
    if (element is FrameworkElement)
    {
        (element as FrameworkElement).ApplyTemplate();
    }
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
        foundElement = GetDescendantByType(visual, type);
        if (foundElement != null)
            break;
    }
    return foundElement;
}

私にとっては完璧に機能します。

于 2015-09-18T01:02:50.247 に答える
0

これは古い投稿ですが、Windows ストア アプリで同じ問題が発生し、次のように動作することがわかりました。

    private void PagesListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        pageListView.UpdateLayout();
        pageListView.ScrollIntoView(pageListView.SelectedItem);
    }

乾杯、ポール

于 2016-04-15T04:14:24.257 に答える
-1

私が直面した問題は似ていました。プログラムで ListBox に追加していて、最後に追加された項目を表示する必要がありました。さまざまな方法を結び付けた後、次の方法が最も簡単で最適であることがわかりました

lstbox.Items.MoveCurrentToLast();
lstbox.ScrollIntoView(lstbox.Items.CurrentItem);
于 2016-03-22T08:26:04.617 に答える