2012-08-27 110 views
1

我使用C#和XAML为Windows 8制作了某种聊天应用程序。在Windows 8上滚动ListView的问题

对于聊天列表,我正在使用ListView绑定ObservableCollection。对于使用自定义控件的消息项目,包含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消息应用程序不使用ListView控件(StackPanel的??): Windows chat sample

可能会更容易使用的StackPanel这个?

+0

的是动画新增ListView的元素呢?也就是说,他们看起来是全尺寸的,还是从小尺寸开始扩大到全尺寸,给用户一个视觉提示,他们被添加了?这可能可以解释为什么即使ScrollToBottom不起作用:您滚动到底部,但该项目还没有达到其最终高度,所以底部移动一点点,因为它完成动画。 –

+0

@JoeWhite是的,动画出现在哪里。我曾尝试在调用滚动方法之前设置延迟2秒,但无论如何都没有成功。 – xVir

回答

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