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

WindowsPhone ユニバーサル アプリの場合は、次を使用できます。

 var scrollableHeight = ScrollViewer.ScrollableHeight;
        if (scrollableHeight > 0)
        {
           ScrollViewer.ScrollToVerticalOffset(scrollableHeight);
        }
于 2015-07-22T13:07:12.227 に答える
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かの極端なエッジ ケースでは技術的に正しくない可能性がありますが、目的にはほぼ完全に理想的です。技術的には、 に任意の大きSizeさを使用しMeasure(Size)て、同じ効果を得ることができます。あなたのソリューションに最適なものは何でも、これが役立つことを願っています -ck

于 2013-05-16T16:16:03.047 に答える
0

ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ActualHeight) は機能するはずですが、コードがスクロール ビューアーのコンテンツを更新したばかりの場合は、スクロールする前に ScrollViewer.UpdateLayout() を呼び出して、ScrollViewer.ActualHeight が最新の状態になるようにすることができます。

于 2013-01-04T20:20:49.430 に答える
0

私は以下を使用しました:

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

もう 1 つの解決策は、項目を に入れ、ScrollIntoViewメソッドListBoxを使用することです。

于 2012-06-23T19:22:17.880 に答える
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 に答える