2011-01-31 12 views
0

(ObservableCollectionがサポートする)CollectionViewSourceにバインドされたリストボックスがあります。バックエンドコレクションにアイテムを追加すると、リストボックスは自動的にそれらをビューにスクロールします。この動作を無効にするにはどうすればよいですか?リストボックスは、新しいコンテンツを追加するときにスクロールします。

<ListBox ItemsSource="{Binding}" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" 
       HorizontalContentAlignment="Center" 
       VerticalContentAlignment="Stretch"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0" 
           CanVerticallyScroll="False" 
           CanHorizontallyScroll="True" 
           /> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
     </ListBox> 

EDIT:これは.NET 4.0、Visual StudioのAddRangeを使用している場合、この現象は発生しません2010であるが、要素は高価であり、私はするためにDispatcher.Invokeを使用して、一度にそれらを1つずつ追加UIの応答性を保つ。

EDIT2:私はVirtualizationStackPanelを使用しない理由は3回提案されているため、「あまりにもハード」を仮想化するためです。私は、私のメソッドを使用するので、すべてのアイテムが一度作成され、UIが応答するので、通常のスタックパネルよりも多くの作業を実行することがわかります。仮想化パネルでは、新しいアイテムがスクロールして表示されるとロックされ、一時停止するともう少し作成されます。さらに、ロードされていないアイテムが正しくイベントを受け取らないという問題があり、あまりにもスクロールしすぎると、以前のアイテムは破棄されてしまい、後で作成されるように強制されます。 スタックパネルを使用して、初期ロード時間を除いて、これらの問題をすべて回避しています。

+0

使用しているフレームワークのバージョンは何ですか?私はこれをVS2008/framework 3.5に入れましたが、それはどのような種類のスクロールも表示されませんでした。 – RQDQ

+0

「ObservableCollection」に直接バインドしようとしましたが、アイテムが追加されたときにスクロールしませんでした。 (また、私は 'VirtualizingStackPanel'を通常のものの代わりに使用します) –

+0

WPFの知識がちょっと薄いので、暗闇の中で撮影してください:ItemsPanelTemplateのVirtualizingStackPanelでなければならないのですか?複数の項目を追加するためのUI更新の問題にも役立ちます。 – Tergiver

答えて

0

他の要素が行っていることを確認してください。この場合、私が追加していた要素(サードパーティのソフトウェア)には、要素の1つがRequestBringIntoViewを呼び出すバグがありました。これらの呼び出しの間にUIが更新されなかったため、リストボックスが最後に向かってジャンプするように見えるように見えました。イベントを飲み込むと正しい行動につながります。

関連する問題