我需要知道 aListBox
第一次完成渲染的时间,以便我可以将其滚动到顶部以向用户展示列表中的第一项。
我有一个ListBox
使用RichTextBox
它的DataTemplate
:
<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,0,20,0"
Loaded="RichTextBox_Loaded"
ContentChanged="RichTextBox_ContentChanged"
SelectionChanged="RichTextBox_SelectionChanged"/>
...
</ContentControl>
...
</Grid>
</DataTemplate>
ListBox
绑定到ObservableCollection
一个.
我在滚动时遇到问题ListBox
- 如果 的高度RichTextBox
大于用户的高度,ListBox
则用户无法滚动到RichTextBox
. 将ListBox
跳转到列表中的下一项。滚动条滑块的高度也会改变。RichTextBox
这是因为只有在实际渲染时才计算实际高度。当它离开屏幕时,高度会恢复为较小的值(我认为代码假设文本可以全部放在一行上,而不必被换行)。
我将这些问题追溯到ListBox
使用 aVirtualisingStackPanel
来绘制项目。当我用简单的替换它时,StackPanel
这些问题就消失了。
然后这产生了我现在遇到的问题,即ListBox
在初始加载时滚动到列表底部。和事件Loaded
发生在数据加载之前。我尝试在初始化时监听视图模型上的事件:LayoutUpdated
ListBox
PropertyChanged
ObservableCollection
void editViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "ListDataSource":
// Try to scroll to the top of the ListBox
break;
}
}
这也太早了。该列表在此事件被触发并导致滚动到底部后呈现。ListBox