2011-08-04 19 views
2

私は、項目のデータテンプレートにWindowsFormsHostを持つデータバインドTreeViewを持っています。 TreeViewの項目が増えるほど、WindowsFormsHostが多いほど、UIが遅くなります。WPF:なぜ複数のWindowsFormsHostでUIが低速になるのですか?

TreeViewはTabControl内にあり、TabControl自体がTabControl内にあります。この不安定さは、TabItemが選択されたとき(つまり、別のTabItemからTreeViewでTabItemに切り替えるとき)にはっきりと分かります。リストボックスの内容をスクロールし、ボタンをクリックした後

class Foo { public string Bar { get { return DateTime.Now.Ticks.ToString(); } } } 

void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (lst.ItemsSource == null) 
     lst.ItemsSource = new ObservableCollection<Foo>(); 
    for (int j = 0; j < 50; j++) 
     (lst.ItemsSource as IList<Foo>).Add(new Foo()); 
} 

:フォームのコードでこれにより

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <TabControl> 
     <TabItem Header="Tab 1"> 
      <StackPanel> 
       <Button Content="Add 50 WindowsFormsHost controls" 
         Click="Button_Click" /> 
       <ListBox Name="lst" Height="300"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding Path=Bar}" /> 
           <WindowsFormsHost /> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </StackPanel> 
     </TabItem> 
     <TabItem Header="Tab 2" /> 
    </TabControl> 
</Window> 

:簡素化するために

、私の代わりにTreeViewコントロールのリストボックスでシンプルなアプリを作りました液体が少なくなり、タブ1に戻るときに遅れがあります。

何が起こっているのか、それについて何かがある場合のアイデアはありますか?

答えて

0

WPF ListBoxの項目に複数のWindowsFormsHostをホストする代わりに、上記の項目を持つ1つのWinForm ListBoxを1つのWindowsFormsHostでホストできないのはなぜですか?これにより、スクロールが簡単になるだけでなく(WinFormsのUIコンテキスト全体が原因)、WPFアプリケーションのメモリを効率的にすることができます(単一のWindowsFormsHostのため)。

これがあなたの目的でない場合は、リストボックスのアイテムパネル(デフォルトではVirtualizedStackPanel)の仮想化を緩めるようにしてください。

これが役立つかどうか教えてください。

関連する問題