2016-10-31 6 views
1

私は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のデザインをストックコンテンツで再構築するのは非常に簡単です。最後の手段として自分で描画したいコントロールだけです。

+1

「仮想化」が必要なのは、現在表示されているスクロールされているコントロールのみを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をリギングすることができます。ほとんど理想的ではありませんが、最も面倒なことはありません。 –

+1

私の推測では、実際にはビューのインスタンス化に最も時間を費やしているレイアウトステップです。スローなビューの最初のオープニング(スクロールのパフォーマンスは良いと言えます)だけです。その場合、仮想化は多分あなたを助けません。私はレイアウトのステップをスピードアップする唯一の方法は、固定された高さと幅を使用することになると思う。しかし、このように多くのコントロールを使用すると、パフォーマンスをどれだけ上回ることができるかわかりません。 –

+0

私はあなたのUniformGridでこれを試してみました。コンバータを引き抜こうとしましたが、固定された高さと幅などを試しました。間違いなくまだリリースするには遅すぎる。次に、UniformGridをVirtualizingStackPanelに置き換えようとしました(そして、ItemsPanel全体をコメントアウトしています)。それは*同じコレクションで即座に*始まりました。 –

答えて

0

仮想化を使用して、あなたの問題に対する可能な解決策についてはこちらをご覧ください:

WPF Data Virtualization

をまた、あなたは別の道を行くしたい場合は、様々で仮想化を扱う商用サードパーティのWPFコントロールライブラリがあります成功の度合い。 Xceed、Syncfusion、DevExpress、Telerikのようにいくつか挙げると、

私は、Uiを構築するのに非常に時間がかかります。

あなたはVS2015(またはそれ以上のもの)を使用していることを願っていますが、これほど長い時間がかかっていることへの回答を得るにはいくつかの方法があります。 Visual Studioには、ビジュアルツリーをリアルタイムで表示できるライブビジュアルツリーツール(デバッグ - > Windows)があります。このツールを使用すると、必要のないUI要素の一部を見つけて削除することができます(境界線、 (Alt + F2)を実行してCPU使用量を選択すると、プログラムが最も多くの時間を費やしている場所を確認できるレポートが生成されます。うまくいけば、後で最適化できる特定の方法に問題が隔離されます。

さらに、問題についての詳細を歓迎します。 ItemsSourceに移入するコードは正確に何ですか?

+0

私はこれが仮想化で解決できる問題ではないと思います。彼は、スクロールのパフォーマンスが良いことを言います、それは遅いだけのビューの最初の開きです。それは、ビジュアルツリーのレイアウトステップが主要なボトルネックであることを私に示唆しています。スクロールのパフォーマンスが悪い場合は、仮想化を使用することに同意します。 –

+0

@Dragos:お返事ありがとうございます。私は仮想化を試みていないのではない。しかし残念ながら、私はUIコードの間違った場所で何か間違ったことをやっているようです。私の最初の仮想化の試みは、ビジュアルツリーに60000個のアイテムがあり、それが遅く開き、最後のアイテムにスクロールすると、ビジュアルツリーが最初に発生する〜2000個のアイテムに減らされました。私はリンクのおかげで、仮想化に関する記事を読んでいます。 – melwynoo

+0

〜60kのオブジェクトが2kに縮小されている場合は、ガベージコレクションが大幅に減り、アプリケーションの速度が著しく低下する可能性があります。dotMemoryなどの商用アプリケーションを使用して、どのオブジェクトが割り当てられているかを調べることができます。それ以外にも、WPFには1つのレンダリングスレッド(および1つのUIスレッド)があり、https://msdn.microsoft.com/en-us/library/ms741870(v=vs.110)の完全な読込みを参照してください。 aspx ビジュアルツリーのコントロールを最適化する方法については、こちらを参照してください。https://msdn.microsoft.com/en-us/library/cc716879(v=vs.100).aspx – brakeroo

関連する問題