Listview 在Windows 8上滚动列表视图时出现问题

Listview 在Windows 8上滚动列表视图时出现问题,listview,windows-8,windows-runtime,scrollviewer,Listview,Windows 8,Windows Runtime,Scrollviewer,我使用C#和XAML为windows8制作了一些聊天应用程序 对于聊天列表,我使用与ObservableCollection绑定的ListView。对于我正在使用自定义控件的消息项,包含RichTextBlock 我想将ListView滚动到底部,使新消息可见。 我面临的问题是: ScrollIntoView方法不会使整个消息项可见,它只使消息项的顶部可见 因此,我还尝试了以下解决方案: 获取ListView的ScrollViewer并使用ScrollViewer的方法 public stati

我使用C#和XAML为windows8制作了一些聊天应用程序

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

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

因此,我还尝试了以下解决方案: 获取ListView的ScrollViewer并使用ScrollViewer的方法

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

publicstaticvoidscrolltobttom(此ListView ListView)
{
var scrollViewer=listView.GetFirstDescendantOfType();
scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
}
同样的效果。某些消息项没有完全滚动

此外,我还尝试在滚动之前进行延迟: 新的ManualResetEvent(错误)。WaitOne(2000)

我没有更多的想法如何使自动滚动聊天列表。我怎么能做到

看起来,哪些Windows消息传递应用程序不使用ListView(StackPanel??):


使用StackPanel可能会更容易吗?

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

var newChatMsg = new ChatMsg("foo foo bar bar");
messageObservableColllection.Add(newChatMsg);
您只需在all to add()之后添加以下代码行

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

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


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

var newChatMsg = new ChatMsg("foo foo bar bar");
messageObservableColllection.Add(newChatMsg);
您只需在all to add()之后添加以下代码行

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

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


ListView是否正在为新添加的元素设置动画?也就是说,它们看起来是全尺寸的,还是从一开始就很小,然后扩展到全尺寸,给用户一个视觉提示,表明它们正在被添加?这也许可以解释为什么连ScrollToBottom都不起作用:您滚动到底部,但项目尚未达到其最终高度,因此底部在完成动画制作时会移动多一点。@JoeWhite是的,显示项目的动画在哪里。在调用scroll方法之前,我尝试设置延迟2秒,但无论如何都没有成功。ListView是否正在为新添加的元素设置动画?也就是说,它们看起来是全尺寸的,还是从一开始就很小,然后扩展到全尺寸,给用户一个视觉提示,表明它们正在被添加?这也许可以解释为什么连ScrollToBottom都不起作用:您滚动到底部,但项目尚未达到其最终高度,因此底部在完成动画制作时会移动多一点。@JoeWhite是的,显示项目的动画在哪里。我尝试在调用scroll方法之前设置延迟2秒,但无论如何都没有成功。
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                listbox1.ScrollIntoView(newChatMsg);
            });