私はWPFで非常に新しいので、同時に多くのUIElementsでビューを作成する方法について助言が必要です。私がやりたいことは、各セルの幅と高さが固定された何らかの種類の表を表示することです。各セルには、背中と前景が異なるテキストブロックの乱数を使用できます(画像参照)。私がこれまでに行ったことある多くのUIElementsを使用してWPFのパフォーマンスを改善する
Image for table-like view with many UiElements
...私はitemcontrol内の項目を結合し、一つのセルの内容のために、ユーザーコントロールを作成しました。
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{Binding Backcolor, Converter={StaticResource IntegerToBrushConverter}}" >
<Viewbox MaxHeight="20" >
<TextBlock TextWrapping="Wrap" Text="{Binding Caption}"
Foreground="{Binding Forecolor, Converter={StaticResource IntegerToBrushConverter}}"/>
</Viewbox>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
このusercontrolは、テーブルのx軸を表すitemcontrolにもバインドされています。
y軸についても、素敵なスクロールビューアを使用して同じことが行われます。だから、問題は、仮想ツリーには多くの要素があるということです。私のサンプルの場合、60.000以上の要素がツリーにリストされています。このため、ビューを開くときにパフォーマンスが低下します。スクロールのパフォーマンスは大丈夫ですが、表示を開くには数秒かかります。
私はCacheModeのようなものを試しましたが、そのすべてがオープニングパフォーマンスに影響しません。 VirtualizingStackPanelを使用すると、スクロールのパフォーマンスが低下します。私はUiを構築するのにそれほど時間がかかります。彼はすべてのUiElementsを測定するのに多くの時間が必要だと思われますが、わかりません...
このようなUiElementリッチビューをもっと速くするためのヒントはありますか?私が言ったように、私はWPFで非常に新しく、これは単なるパフォーマンステストです。私たちはWinformsのようなUiを持っていますが、そこには、テーブル全体がユーザーが描いたものです。 WPFでは、Winformsのデザインをストックコンテンツで再構築するのは非常に簡単です。最後の手段として自分で描画したいコントロールだけです。
「仮想化」が必要なのは、現在表示されているスクロールされているコントロールのみをUIに作成させたい場合です。 ['VirtualizingStackpanel'](https://msdn.microsoft.com/en-us/library/system.windows.controls。)があります。virtualizingstackpanel%28v = vs.110%29.aspx?f = 255&MSPPError = -2147217396)それはそうです。仮想化UniformGridはありません。あなたが持っているものを仮想化するコントロールが見つからない場合は、多数の水平なVirtualizingStackPanelを含む垂直型のVirtualizingStackPanelをリギングすることができます。ほとんど理想的ではありませんが、最も面倒なことはありません。 –
私の推測では、実際にはビューのインスタンス化に最も時間を費やしているレイアウトステップです。スローなビューの最初のオープニング(スクロールのパフォーマンスは良いと言えます)だけです。その場合、仮想化は多分あなたを助けません。私はレイアウトのステップをスピードアップする唯一の方法は、固定された高さと幅を使用することになると思う。しかし、このように多くのコントロールを使用すると、パフォーマンスをどれだけ上回ることができるかわかりません。 –
私はあなたのUniformGridでこれを試してみました。コンバータを引き抜こうとしましたが、固定された高さと幅などを試しました。間違いなくまだリリースするには遅すぎる。次に、UniformGridをVirtualizingStackPanelに置き換えようとしました(そして、ItemsPanel全体をコメントアウトしています)。それは*同じコレクションで即座に*始まりました。 –