ListBox.ScrollIntoView仅在延迟后才起作用

时间:2013-07-23 09:17:35

标签: c# .net wpf

我遇到listbox.ScrollIntoView方法的问题 - 它不起作用。以下是代码段:

// the listbox is binded to a "Thumbnails" property
this.Thumbnails = new VirtualizableCollection<RecordingThumbnailItem>(this.thumbnailsProvider) { ItemsStep = this.ThumbnailsStep };
this.listBox.ScrollIntoView(this.Thumbnails[thumbnailToSelect]);

我注意到如果我稍后调用ScrollIntoView(例如在定义绑定源后500毫秒内)一切正常。所以我想在控件获得某些特定状态后应该调用ScrollIntoView; 如果是的话,我怎么能检测到它?也许使用一些活动? 最后,我只需要强制执行我的水平列表框以显示右端的最后一项,但不像往常一样显示左侧。也许存在其他一些方法?

1 个答案:

答案 0 :(得分:1)

问题是代表尚未创建的每个项目的视图,因此视图无法滚动到屏幕上。

您可以使用DispatcherScrollIntoView()调用进行排队,其优先级低于用户界面,这样可以在UI时间内生成视图。

试试这个:

this.Thumbnails = new VirtualizableCollection<RecordingThumbnailItem>(this.thumbnailsProvider) { ItemsStep = this.ThumbnailsStep };
Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.ContextIdle,
    new Action(() => this.listBox.ScrollIntoView(this.Thumbnails[thumbnailToSelect])
);

如果CurrentDispatcher恰好是UI之一,那么您可能需要用Dispatcher.CurrentDispatcher替换Application.Current.Dispatcher