【问题标题】:Problems with scrolling ListView on Windows 8在 Windows 8 上滚动 ListView 的问题
【发布时间】:2012-08-21 21:02:01
【问题描述】:

我使用 C# 和 XAML 为 Windows 8 制作了某种聊天应用程序。

对于聊天列表,我使用与 ObservableCollection 绑定的 ListView。对于我使用自定义控件的消息项,包含 RichTextBlock。

我想将 ListView 滚动到底部,以使新消息可见。 我遇到的问题: ScrollIntoView 方法不会使整个消息项可见,它仅使消息项的顶部可见。

所以,我也尝试了WinRT XAML Toolkit 的解决方案: 获取ListView的ScrollViewer并使用ScrollViewer的方法

public static void ScrollToBottom(this ListView listView)
{
   var scrollViewer = listView.GetFirstDescendantOfType<ScrollViewer>();
   scrollViewer.ScrollToVerticalOffset(scrollViewer.ScrollableHeight);
}

public static void ScrollToBottom(this ListView listView)
{
   var scrollViewer = listView.GetFirstDescendantOfType<ScrollViewer>();
   scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
}

具有相同的效果。一些消息项没有完全滚动。

我还尝试在滚动之前进行延迟: 新的 ManualResetEvent(false).WaitOne(2000);

我没有更多关于如何制作自动滚动聊天列表的想法。我该怎么做?

看来,什么 Windows Messaging 应用程序不使用 ListView (StackPanel??):

使用 StackPanel 会更容易吗?

【问题讨论】:

  • ListView 是否对新添加的元素进行动画处理?即,它们是显示为全尺寸,还是从小开始并扩展为全尺寸,以便为用户提供正在添加它们的视觉提示?这或许可以解释为什么即使 ScrollToBottom 也不起作用:您滚动到底部,但该项目尚未达到其最终高度,因此当完成动画时,底部会移动一点。
  • @JoeWhite 是的,出现项目的动画在哪里。我尝试在调用滚动方法之前设置延迟 2 秒,但无论如何都没有成功。

标签: listview windows-8 windows-runtime scrollviewer


【解决方案1】:

我假设您的代码如下所示,您正在向 observablecollection 添加新的聊天消息

var newChatMsg = new ChatMsg("foo foo bar bar");
messageObservableColllection.Add(newChatMsg);

您需要做的就是将以下代码行添加到 Add() 之后

this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                listbox1.ScrollIntoView(newChatMsg);
            });

这将调用以将 ListView 滚动到调度程序队列中最近添加的聊天消息,这将在 INofityProperty 触发并使用新消息更新 ListView 后的某个时间点触发。如果在添加或删除项目时需要运行任何动画,这一点很重要。

最后,如果项目没有完全滚动到视图中,则可能是项目高度存在问题。 ScrollIntoView 有一个覆盖,可让您指定要对齐内容的框架边缘。如果您希望显示特定的子元素,您还可以手动指定额外的滚动量。有关详细信息,请参阅此 MSDN 论坛帖子:

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/24e91a3e-6cd3-468b-97eb-c90f39532aba

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多