在Windows 8上滚动ListView的问题

时间:2012-08-27 11:12:34

标签: listview windows-8 windows-runtime scrollviewer

我使用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);
}

效果相同。某些消息项未完全滚动。

此外,我在滚动之前尝试过延迟:      new ManualResetEvent(false).WaitOne(2000);

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

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

可能会更容易使用StackPanel吗?

1 个答案:

答案 0 :(得分:1)

我假设您的代码类似于下面的代码,您可以在其中向observablecollection添加新的聊天消息

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

您需要做的就是在all之后将以下代码行添加到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