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
実際にレンダリングされたときにのみ計算されるためです。画面から外れると、高さはより小さな値に戻ります (コードは、テキストを折り返すのではなく、すべて 1 行に収めることができると想定していると思います)。
これらの問題は、 がアイテムを描画するために を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
、 が一番下までスクロールします。