1

ListBoxのデフォルトのItemsPanelはVirtualizingStackPanelだと誰もが言っています。ListBoxから派生したクラス(MyListBoxと呼びます)を作成しましたが、デフォルトではStackPanelになっています。

つまり、たとえば次のように、仮想化を強制する必要があります。

const string itemsPanelTemplateString = @"
<ItemsPanelTemplate
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
<VirtualizingStackPanel/>
</ItemsPanelTemplate>";

MyListBox {
    this.ItemsPanel = (ItemsPanelTemplate)
        System.Windows.Markup.XamlReader.Load(itemsPanelTemplateString);
}

ここに私のクラスを転載することはできますが、それは重要ではありません。一般的な答えを知りたいのですが。

このクラスは、事前定義されたListBoxスタイルを変更しませんが、独自のListBoxItemから派生したクラスを使用します。

私の同僚が過去にそれぞれのリストボックスコードを見たと言ったので、仮想化を使用するためのいくつかの条件があると確信しています。残念ながら、現時点では、MSdllのデバッグバージョンにアクセスできません。

4

4 に答える 4

1

ListBox および ListBox から派生したコントロールは、ユーザー コードが明示的に変更しない限り、既定で VirtualizedStackPanel を ItemsPanel として持ちます。

ただし、カスタム ListBox が直接 ItemsControl から派生した場合 (実際には ListBox から派生するのではなく)、StackPanel をデフォルトの ItemsPanel として取得します。

それはあなたのコードに当てはまりますか?そうでない場合は、制御コードを共有してください。

于 2011-04-08T22:22:42.223 に答える
1

解決しました。それは私のバグでした:

ListBox.OnApplyTemplate() をオーバーライドするとき (時間測定の目的で)、base.OnApplyTemplate() を呼び出すのを忘れていました。どうやらアイテムパネルの選択はそこで行われるようです。

すべてが機能しているように見えるため、危険なバグです。

助けようとしたすべての人に感謝します。

于 2011-04-11T13:25:51.233 に答える
0

ListBox の既定のスタイルは、ItemsPanel テンプレートを割り当てません。

テンプレートが提供されていない場合、リフレクターで見ることができる内部コードによると、内部OnApplyTemplateに a が割り当てられVirtualizingStackPanelます。ItemsHostItemsPanel

結局、クラスコードを含めることは良い考えかもしれません。

于 2011-04-08T16:56:23.787 に答える
0

http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performanceで、リストボックスのパフォーマンスを改善するための適切な推奨事項を見つけることができます。 aspx

また、 http: //blogs.msdn.com/b/delay/archive/2010/09/08/never-do-today-what-you-can-put-off-till-tomorrow-deferredloadlistbox に記載されている優れた代替手段もあります。-and-stackpanel-help-windows-phone-7-lists-scroll-smoothly-and-consistently.aspx

(明らかに) 注意すべきもう 1 つのことは、バインドしているコレクションが implements の場合にのみ、仮想化も取得されることですIList

于 2011-04-08T18:36:17.687 に答える