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);

这是公认的做法吗?我必须等待一些随机的时间吗?

4

9 回答 9

16

使用 ActualHeight 对我不起作用(我还没有弄清楚为什么) - 但是像这样使用 ScrollableHeight 就可以了:

// adding item to ItemsControl...
// ...
_scrollViewer.UpdateLayout();
_scrollViewer.ScrollToVerticalOffset(_scrollViewer.ScrollableHeight);
于 2013-08-20T07:28:43.803 回答
15

对于 Windows Phone 8.1,我使用这个:

MyScrollViewer.ChangeView(0.0f, double.MaxValue, 1.0f);
于 2014-07-19T09:46:29.053 回答
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 代码时尤其有用。

于 2017-02-21T17:11:05.390 回答
2

除了 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

于 2013-05-16T16:16:03.047 回答
2

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

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

于 2014-10-09T21:46:40.597 回答
2

对于 WindowsPhone 通用应用程序,您可以使用:

 var scrollableHeight = ScrollViewer.ScrollableHeight;
        if (scrollableHeight > 0)
        {
           ScrollViewer.ScrollToVerticalOffset(scrollableHeight);
        }
于 2015-07-22T13:07:12.227 回答
0

我使用了以下内容:

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

另一种解决方案是将项目放入 aListBox并使用ScrollIntoView方法

于 2012-06-23T19:22:17.880 回答
0

ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ActualHeight) 应该可以工作,但是如果您的代码刚刚更新了滚动查看器的内容,您可能需要在滚动之前调用 ScrollViewer.UpdateLayout(),以便 ScrollViewer.ActualHeight 是最新的。

于 2013-01-04T20:20:49.430 回答
0

对于 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

于 2014-11-26T00:46:49.420 回答