如何知道ListBox何时在Silverlight中完成渲染?

前端之家收集整理的这篇文章主要介绍了如何知道ListBox何时在Silverlight中完成渲染?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要知道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;
    }
}

这太火了.触发此事件后将呈现该列表,并使ListBox滚动到底部.

解决方法

尝试滚动Loaded处理程序,但Dispatcher稍微延迟它.这样的事情

void OnLoaded(...)
{
   Dispatcher.BeginInvoke(() => {/*Scroll your ListBox here*/});
}

它可以帮助.

猜你在找的Silverlight相关文章