ListVew ScrollToBottom,最后一个元素与底边对齐

时间:2016-08-03 19:08:10

标签: c# wpf xaml listview

我正在寻找的基本上是常规的控制台行为。它开始在顶部添加文本,当窗口填满时,它会自动开始滚动以保持最近添加的行。

我遇到的问题是ScrollToBottom上的ListView获取 n 最后的项目(其中n是多少适合的项目),但随后对齐物品位于对照顶部,底部留有间隙。

添加以下内容可以部分解决:

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel VerticalAlignment="Bottom"/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

正确保持最后一项与底部对齐。直到我调用ScrollToBottom(然后再次出现间隙)。

以下是我能提出的最小代码片段,但仍显示此行为。

MainWindow.xaml

<Window x:Class="ScrollToBottomTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="200" Width="200">
    <ListView x:Name="listView">

        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" Background="Gray"/>
            </DataTemplate>
        </ListView.ItemTemplate>

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
</Window>

MainWindow.xaml.cs

using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace ScrollToBottomTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            new Thread(() =>
            {
                while (true)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        listView.Items.Add("abc");
                        ScrollToBottom();
                    });
                    Thread.Sleep(250);
                }
            })
            { IsBackground = true }.Start();
        }

        private void ScrollToBottom()
        {
            if (VisualTreeHelper.GetChildrenCount(listView) > 0)
            {
                Border border = (Border)VisualTreeHelper.GetChild(listView, 0);
                ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
                scrollViewer.ScrollToBottom();
            }
        }
    }
}

我会非常感谢任何提示。

1 个答案:

答案 0 :(得分:0)

创建ListViewItem,然后添加它,然后在项目上调用BringIntoView。