2009-07-30 29 views
2

私は自分自身でこの種のピクルスを作成しました。私は、This MSDN articleで説明されているTreeListViewに類似したカスタムWPFコントロールと、ネット上の他の多くの場所を作成しています。この時点でかなり大きな山が揃っており、仮想化面を除いて、目標をかなり上回っています。私が上書きしたTreeViewTreeViewItemテンプレートはどちらもVirtualizingStackPanelを使ってアイテムを提示していますが、これはすべて期待どおりに作成されていることを確認しました。仮想化はルートレベルの項目で正しく機能します(ScrollViewerに現在表示されているもののUI要素のみが調理されます)。TreeViewは、折りたたまれたノードの要素を生成しません。この問題は、ノードを拡張するときに発生します。ノード内のすべての要素に対して、すべての要素がクックアップされます(数千ものオフスクリーンでさえ)。WPFのネストされたコンテナ(virtualizingstackpanel)を単一の親スクロールバーに仮想化

それは私が何とかルートレベルのVSPは、デフォルトでにフックアップされることを同じメインscrollviewに内側のネストされたVirtualizingStackPanel Sのscrollownerプロパティを設定して行うために必要なすべてのように私には思えたが、私はMSFTのポスターを読んhereこれはうまくいかないと言っています。

残念ながら、このことは仮想化が発生していない泥のように遅いため、何らかの解決策を考え出す必要があります。どんな提案も大歓迎です。

+0

私はそれがしばらくしていることを知っていますが、あなたはこれを回避するために何をしたのでしょうか? –

+0

私はちょうど[Davidのアカウントはしばらくの間非アクティブになっていることに気づきました](http://stackoverflow.com/users/17784/david-hay?post-filters=All&post-sorts=Newest)。だから私の後ろに来る人のために[[私の答えを参照してください](http://stackoverflow.com/a/42842476/3063273) –

答えて

0

私は仮想化スタックパネルで何をしないかのリストへのリンクを持っていましたが、何らかの理由でページが空白になりました。ここではそれについて少し話し、別のページです:

http://www.designerwpf.com/2008/02/12/listview-and-listbox-performance-issues/

とさえ話して1つのイムへのリンクは、そのいつものブランク。あなたがそのページを見ればMark Shurmerのブログへのリンク。あなたはそれを試してみたい場合は、ここにリンクがあります:あなたは、いくつかを投稿する場合

Part 1 Part 2 Part 3

http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/

ビーStollnitzも役立つかもしれない、その上にいくつかの記事が掲載されていますあなたのコードのうち、誰かがあなたがより良い実装になるのを助けるためにスパゲティを少し解くことができるかもしれません。

EDIT:働くかもしれないリンクを発見(archive.orgありがとう!!!): http://web.archive.org/web/20080104163725/http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/

0

私は、これは古い質問ですけど、私にはまだ関連しました。

私の場合、正確に2つのレイヤーが必要なので、TreeViewはカットしないと思っていました。表示されるアイテムのタイプは2つのレイヤーによって異なります。また、私はExpanderのリストをリファクタリングしていますので、私は一次元的に考えていました。

しかし、私はあなたがHierarchicalDataTemplateあなた自身を含めることTreeViewItemTemplateをカスタマイズし、あなた自身でそのHierarchicalDataTemplateItemTemplateDataTemplate ...プレストを合わせてカスタマイズできることができることを実現しました!正確に2つのレイヤーは、それぞれに異なるものがあります!

私の指摘は、TreeViewは独自のカスタムコントロールを作成しないように十分な柔軟性があるということです。ここで

は、私がやったことだ:

XAML:

<Page x:Class="Foo.Views.TreePage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Foo.Views" 
     xmlns:viewModel="clr-namespace:Foo.ViewModels" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     Title="Tree page" 
     d:DataContext="{d:DesignInstance Type=viewModel:TreeModel}"> 
    <TreeView 
     VirtualizingPanel.IsVirtualizing="True" 
     VirtualizingPanel.VirtualizationMode="Recycling" 
     ScrollViewer.CanContentScroll="True" 
     VirtualizingPanel.ScrollUnit="Pixel" 
     ItemsSource="{Binding Values}"><!-- IList<Person> --> 
     <TreeView.ItemTemplate><!-- Template for first layer, which has a HierarchicalDataTemplate so that this layer will expand --> 
      <HierarchicalDataTemplate 
       ItemsSource="{Binding Expenses}"><!-- IList<Expense> --> 
       <HierarchicalDataTemplate.ItemTemplate><!-- Template for the second layer, which has a DataTemplate instead of HierarchicalDataTemplate so that this layer won't expand --> 
        <DataTemplate> 
         <TextBlock Text="{Binding Amount}"/><!-- Expense amount in dollars --> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 

       <TextBlock Text="{Binding Name}"/><!-- Person name --> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
</Page> 

Personクラス:

public class Person 
{ 
    public string Name { get; set; } 
    public List<Expense> Expenses { get; set; } 
} 

Expenseクラス:

public class Expense 
{ 
    public double Amount { get; set; } 
} 

ここで方法ですそれが見えます:

Screenshot of the above code in action

私はそれがUIの仮想化であることを証明するためにSnoopでそれを点検しました。ここでアプリが小さいときにロードされたTreeViewItem秒の数です:

Screenshot showing the number of elements when the app is small

...そして、ここでアプリが(それがこのスニペットを超えていっているフルスクリーン時にロードさTreeViewItem秒の数ですが、あなたが得ますアイデア):

Screenshot showing that there are more elements when the app is fullscreen

今では私が望むどのようにネストされたレイヤーの外観を作るためにスタイリング物事の単純な問題です!

編集:TreeViewは、最初のレイヤーだけでなく、すべてのレイヤーを仮想化することを確認しました。

関連する問題