2

項目のデータ テンプレートに WindowsFormsHost を持つデータ バインドされた TreeView があります。TreeView 内の項目が多いほど、またその中の WindowsFormsHost が多いほど、UI が遅くなります。

TreeView は TabItem 内にあり、それ自体は TabControl 内にあります。TabItem が選択されているとき (つまり、別の TabItem から TreeView を使用して TabItem に切り替えたとき) はいつでも、動きの鈍さが最も明白です。

簡単にするために、TreeView の代わりに ListBox を使用して、よりシンプルなアプリを作成しました。

<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>

フォームのコードでこれを使用します。

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());
}

ボタンをクリックした後、ListBox のコンテンツのスクロールがスムーズではなくなり、タブ 1 に戻るときに遅延が発生します。

なぜこれが起こっているのか、それについて何かできることがあるかどうかについてのアイデアはありますか?

4

1 に答える 1

0

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

これが目的でない場合は、ListBox の項目パネル (デフォルトでは VirtualizedStackPanel) の仮想化を解除してみてください。

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

于 2011-08-04T08:27:10.333 に答える