私はMedia Assistantという名前のopensourceアプリケーションを開発しています。ライブラリを表示するためにListBoxを使用しました。 ItemsSourceは、LibraryItemのリストにバインドされています。ここにXALMがあります。ステータスメッセージを変更したり、待機画面を表示したりすると、WPF ListBoxがスクロールします
<ListBox Name="Tree" DockPanel.Dock="Top"
ItemsSource="{Binding DataSource.OrderedLibraryItems}"
Background="{StaticResource LibraryBackground}"
Width="220" HorizontalAlignment="Left"
BorderThickness="0"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
ScrollViewer.IsDeferredScrollingEnabled="True"
ItemTemplate="{StaticResource ListLibraryItemTemplate}"
SelectionMode="Single"
MouseDoubleClick="HandleMouseDoubleClick"
/>
Dispatcherを使用してスレッドからウィンドウの下部にステータスメッセージを表示すると問題が発生します。
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,new ParameterizedThreadStart(action), state);
リストボックスが上部にスクロールします。ステータスメッセージが表示されない場合は正常に動作します。 datacontextまたはリストアイテムまたはフォーカスは変更されていません。なぜそれがそれをしているのかわからなかった。これは、モーダルでないウィンドウである待機画面を表示するときに発生します。私は別のプロジェクトでそれを再現できませんでした。 HereはMedia Assistantのソースコードです。 BackgroundScannerクラスのメソッドSetStatusMessageのreturn文をコメント解除することで簡単に再作成できます。
醜い作業の回避策です。インデックスが-1の場合、0を表示しようとしました。私はDispatcherメッセージを使用していませんでしたが、ListBoxの上にTextBlockを置くと、私は運が良かったのですが、リストビューで私はより良い動作を得ました。 ListBoxは高速で、私はそれが好きですが、私が理解していないものはいくつかあります。遅延スクロールなしで同じ動作をしますか?バインディングモードがonewayの場合、宣言します。 – Paparazzi