我需要知道 ListBox
已经完成了第一次渲染,以便我可以将其滚动到顶部以向用户展示列表中的第一项。
我有一个 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
绑定(bind)到 ObservableCollection
.我在滚动
ListBox
时遇到问题- 如果 RichTextBox
的高度大于 ListBox
用户无法滚动到 RichTextBox
的底部. ListBox
将跳转到列表中的下一项。滚动条 slider 的高度也会改变。这是因为 RichTextBox
的实际高度仅在实际渲染时计算。当它离开屏幕时,高度会恢复为较小的值(我认为代码假定文本可以全部放在一行上,而不必被换行)。我将这些问题追溯到
ListBox
的使用 VirtualisingStackPanel
绘制项目。当我用一个简单的 StackPanel
替换它时这些问题都消失了。这产生了我现在遇到的问题,即
ListBox
在初始加载时滚动到列表底部。 Loaded
和 LayoutUpdated
ListBox
上的事件在数据加载之前发生。我试着收听 PropertyChanged
ObservableCollection
时 View 模型上的事件被初始化:void editViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "ListDataSource":
// Try to scroll to the top of the ListBox
break;
}
}
这也太早了。列表呈现 之后 此事件被触发并导致
ListBox
滚动到底部。
最佳答案
尝试在 Loaded 处理程序上滚动,但通过 Dispatcher 将其延迟一点。类似的东西
void OnLoaded(...)
{
Dispatcher.BeginInvoke(() => {/*Scroll your ListBox here*/});
}
它可以提供帮助。
关于silverlight - 我如何知道 ListBox 何时在 Silverlight 中完成渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11291920/