【发布时间】: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