最好的方式来滚动到结束的ScrollViewer的(Best Way to Scroll to En

2019-07-30 02:14发布

目前,我已经得到了我的代码自动滚动到最后当我添加一个新项目的唯一方法如下:

XAML:

<ScrollViewer x:Name="chatViewScroller" HorizontalAlignment="Left" Height="201" Margin="0,32,0,0" VerticalAlignment="Top" Width="475" Background="#7FFFFFFF">
    <StackPanel x:Name="chatViewContent" />
</ScrollViewer>

码:

                chatViewContent.Children.Add(
                    new TextBlock() {
                        Text = text,
                        FontSize = 18,
                        TextWrapping = Windows.UI.Xaml.TextWrapping.Wrap,
                        Margin = new Thickness(10, 3, 10, 0),
                        Foreground = new Windows.UI.Xaml.Media.SolidColorBrush(
                            isServerMessage ? Windows.UI.Colors.Purple : Windows.UI.Colors.Black)
                    });
                await Task.Delay(10);
                chatViewScroller.ScrollToVerticalOffset(chatViewScroller.ScrollableHeight);

这是做它的接受的方式? 我必须等待一段随机时间?

Answer 1:

使用的ActualHeight我没有工作(我还没有弄清楚为什么) - 但使用ScrollableHeight这样做的伎俩:

// adding item to ItemsControl...
// ...
_scrollViewer.UpdateLayout();
_scrollViewer.ScrollToVerticalOffset(_scrollViewer.ScrollableHeight);


Answer 2:

对于Windows Phone的8.1我用这个:

MyScrollViewer.ChangeView(0.0f, double.MaxValue, 1.0f);


Answer 3:

在我看来,最好的办法是从ScrollViewer中以下面的方式继承:

public partial class AutoScrollViewer
{        
    public AutoScrollViewer()
    {
        InitializeComponent();
        this.SizeChanged += (sender, args) => this.ScrollToBottom();
    }
}

和XAML

<ScrollViewer x:Class="AutoScrollViewer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</ScrollViewer>

然后你就可以在XAML直接使用新的类,无需额外的代码后面是有用的,当你有“纯” MVVM代码especailly。



Answer 4:

没有随机异步从来都不是答案中的任何语言的任何东西,除了可能的JavaScript ...它只是总有一个“代码味道”你知道吗?

要做到这一点,正确的方法是强制的的措施“刷新” ScrollViewer同步调用,包括新加入的孩子ScrollViewer.Measure(Size)

你“重新测量后”的ScrollableHeight将是适当的值,你可以使用它,你通常会..

像这样:

    private void AddMessage(string text, Color color)
    {
        var message = new TextBlock
        {
            Text = text,
            FontSize = 18,
            TextWrapping = TextWrapping.Wrap,
            Margin = new Thickness(10, 3, 10, 0),
            Foreground = new SolidColorBrush(color),
        };

        chatViewContent.Children.Add(message);

        chatViewScroller.Measure(chatViewScroller.RenderSize);
        chatViewScroller.ScrollToVerticalOffset(chatViewScroller.ScrollableHeight);
    }

Size我们是用在这里是RenderSize可能在技术上是在一些极端的边缘情况不正确,但它是非常接近完美的适合我们的目的。 你也可以在技术上使用任意大SizeMeasure(Size) ,并得到同样的效果。 什么最适合您的解决方案,希望这有助于-ck



Answer 5:

对于WindowsPhone的通用应用,你可以使用:

 var scrollableHeight = ScrollViewer.ScrollableHeight;
        if (scrollableHeight > 0)
        {
           ScrollViewer.ScrollToVerticalOffset(scrollableHeight);
        }


Answer 6:

如果您正在使用.NET 3.0或更高版本,可以使用ScrollViewer.ScrollToBottom()

MSDN文档: http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.scrolltobottom(v=vs.110).aspx



Answer 7:

我使用的情况如下:

ScrollViewer viewer = GetScrollViewer();
if (viewer != null)
{
    viewer.ScrollToVerticalOffset(viewer.ActualHeight);
}

另一种解决方案是将物品放入一个ListBox ,并使用ScrollIntoView方法



Answer 8:

ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ActualHeight)应该工作,但如果你的代码刚才更新的滚动浏览器的内容,你可能需要调用ScrollViewer.UpdateLayout()滚动之前,让ScrollViewer.ActualHeight将是最新的。



Answer 9:

对于Windows Phone的8.0,你可以使用

MyScrollViewer.ScrollToVerticalOffset(MyScrollViewer.ExtentHeight - MyScrollViewer.ViewportHeight);

请同时参阅http://msdn.microsoft.com/en-us/library/windows/apps/system.windows.controls.scrollviewer.verticaloffset(v=vs.105).aspx



文章来源: Best Way to Scroll to End of ScrollViewer