我需要知道ListBox何时第一次完成渲染,以便我可以将其滚动到顶部以向用户显示列表中的第一个项目.
我有一个ListBox,在其DataTemplate中使用RichTextBox:
<DataTemplate x:Key="HelpTextTemplate"> <Grid> <Grid.ColumnDeFinitions> <ColumnDeFinition Width="*"/> <ColumnDeFinition Width="Auto"/> </Grid.ColumnDeFinitions> ... <ContentControl> ... <RichTextBox x:Name="HelpTextContent" Grid.Row="1" Tag="{Binding Path=HelpObject.Text,Mode=TwoWay}" textwrapping="Wrap" HorizontalAlignment="Stretch" Margin="0,20,0" Loaded="RichTextBox_Loaded" ContentChanged="RichTextBox_ContentChanged" SelectionChanged="RichTextBox_SelectionChanged"/> ... </ContentControl> ... </Grid> </DataTemplate>
ListBox绑定到ObservableCollection.
我在滚动ListBox时遇到问题 – 如果RichTextBox的高度大于ListBox的高度,则用户无法滚动到RichTextBox的底部. ListBox将跳转到列表中的下一个项目.滚动条滑块的高度也会改变.这是因为RichTextBox的实际高度仅在实际渲染时计算.当它离开屏幕时,高度恢复到较小的值(我认为代码假定文本可以全部放在一行而不是必须被包裹).
我将这些问题跟踪到ListBox使用VirtualisingStackPanel来绘制项目.当我用简单的StackPanel替换它时,那些问题就消失了.
这就产生了我现在遇到的问题,即ListBox在初始加载时滚动到列表的底部. ListBox上的Loaded和LayoutUpdated事件在加载数据之前发生.初始化ObservableCollection时,我尝试在视图模型上侦听PropertyChanged事件:
void editviewmodel_PropertyChanged(object sender,PropertyChangedEventArgs e) { switch (e.PropertyName) { case "ListDataSource": // Try to scroll to the top of the ListBox break; } }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。