Как узнать, что ListBox завершил рендеринг в Silverlight?

Мне нужно знать, когда 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привязан к ObservableCollection.

У меня была проблема с прокруткойListBox-если высота RichTextBoxбыла больше, чем у ListBox, пользователь не мог прокручивать до конца RichTextBox. ListBoxпереходил к следующему элементу в списке. Высота ползунка полосы прокрутки также изменится. Это связано с тем, что фактическая высота RichTextBoxвычисляется только при фактическом рендеринге. Когда он находится за пределами экрана, высота возвращается к меньшему значению (. Я думаю, что код предполагает, что весь текст может поместиться в одну строку, а не должен быть обернут ).

Я проследил эти проблемы до того, как ListBoxиспользовал VirtualisingStackPanelдля рисования предметов.Когда я заменил его на простой 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вниз.

7
задан ChrisF 23 September 2013 в 10:14
поделиться