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