我使用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 ??):
可能会更容易使用StackPanel吗?
答案 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论坛帖子: