2012-06-23 32 views
13

Hiện nay, cách duy nhất tôi đã nhận được mã của tôi để tự động cuộn đến cuối cùng khi tôi thêm một mục mới như sau:cách tốt nhất để Di chuyển đến End of ScrollViewer

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> 

Mã số:

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

Đây có phải là cách được chấp nhận không? Tôi có phải đợi một khoảng thời gian ngẫu nhiên không?

+0

Xin chào, bạn có tìm thấy giải pháp nào tốt hơn không? – imslavko

+0

Sẽ chờ đợi Dispatcher.Yield (DispatcherPriority.Input), 'làm việc? – springy76

Trả lời

0

Tôi đã sử dụng như sau:

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

Một giải pháp khác là đặt các mục vào một ListBox và sử dụng phương pháp ScrollIntoView

0

ScrollViewer.ScrollToVerticalOffset (ScrollViewer.ActualHeight) nên làm việc, nhưng nếu mã của bạn vừa mới cập nhật nội dung của trình xem cuộn, bạn có thể muốn gọi ScrollViewer.UpdateLayout() trước khi cuộn, để ScrollViewer.ActualHeight sẽ được cập nhật.

2

không có bất thường ngẫu nhiên không bao giờ là câu trả lời cho bất cứ điều gì trong bất kỳ ngôn ngữ nào ngoại trừ JavaScript có lẽ ... nó luôn luôn có "mã mùi" bạn biết không?

cách thích hợp để làm điều này là để buộc một "refresh" của các biện pháp của ScrollViewer đồng bộ bao gồm các trẻ em mới được bổ sung bằng cách gọi ScrollViewer.Measure(Size)

sau khi bạn "tái biện pháp" các ScrollableHeight sẽ là thích hợp giá trị và bạn có thể sử dụng nó như bình thường ..

như thế này:

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

các Size chúng tôi đang sử dụng ở đây là RenderSize mà về mặt kỹ thuật có thể không chính xác trong một số trường hợp cực cạnh, nhưng nó khá gần với lý tưởng hoàn hảo cho mục đích của chúng tôi. bạn cũng có thể sử dụng kỹ thuật một cách tùy ý Size cho Measure(Size) và nhận được hiệu ứng tương tự. bất cứ điều gì tốt nhất cho giải pháp của bạn, hy vọng điều này sẽ giúp -ck

+0

'.Measure' hoạt động trong WinRT, tuy nhiên nó không hoạt động trong WP8.1 (đôi khi nó cuộn, đôi khi nó không có). 'chatViewContent.UpdateLayout(); chatViewContent.ChangeView (null, chatViewContent.ScrollableHeight, null); 'hoạt động trong WP8.1 [không thử trong WinRT, có thể hoạt động ở cả hai] – Rui

15

Sử dụng ActualHeight đã không làm việc cho tôi (tôi vẫn chưa hiểu tại sao) - nhưng sử dụng ScrollableHeight như thế này đã làm các trick:

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

Đối với Windows Phone 8.1 tôi sử dụng này:

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

Hoạt động tốt trên Windows 8.1 cũng như –

+1

Đây là cách chính xác để làm điều này cho Ứng dụng UWP. Nếu bạn sử dụng ScrollToVerticalOffset trình biên dịch sẽ cung cấp cho bạn: 'ScrollViewer.ScrollToVerticalOffset (double)' là lỗi thời: 'ScrollToVerticalOffset có thể bị thay đổi hoặc không có sẵn cho các bản phát hành sau Windows 8.1. Thay vào đó, hãy sử dụng ChangeView. ' –

2

Đối với ứng dụng WindowsPhone Phổ bạn có thể sử dụng:

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

Trong lựa chọn tốt nhất theo tôi là để kế thừa từ ScrollViewer theo cách sau đây:

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

và XAML

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

Sau đó, bạn có thể sử dụng trực tiếp trong XAML lớp mới mà không cần mã bổ sung phía sau đó là hữu ích khi bạn có mã "MVVM" thuần túy.

Các vấn đề liên quan