WPF: Почему пользовательский интерфейс становится медленным с несколькими WindowsFormsHost? - PullRequest
2 голосов
/ 04 августа 2011

У меня есть привязанный к данным TreeView с WindowsFormsHost в шаблоне данных его элементов.Чем больше элементов в TreeView и тем больше в нем WindowsFormsHost, тем медленнее становится пользовательский интерфейс.

TreeView находится в TabItem, сам в TabControl.Медлительность наиболее очевидна всякий раз, когда выбирается TabItem (т.е. когда я переключаюсь с другого TabItem на TabItem с TreeView).

Для упрощения я сделал более простое приложение с ListBox вместо TreeView:

<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 возникает задержка.

Есть какие-нибудь идеи о том, почему это происходит, и о том, нужно ли с этим что-то делать?

1 Ответ

0 голосов
/ 04 августа 2011

Вместо размещения нескольких WindowsFormsHost в элементах WPF ListBox, почему вы не можете разместить один WinForm ListBox, имеющий вышеуказанные элементы, в одном WindowsFormsHost? Это не только упростит прокрутку (благодаря полностью в контексте пользовательского интерфейса WinForms), но также сделает память вашего приложения WPF эффективной (благодаря единственному WindowsFormsHost).

Если это не то, для чего вы работаете, попробуйте потерять виртуализацию панели элементов вашего ListBox (которая по умолчанию является VirtualizedStackPanel).

Дайте мне знать, если это поможет?

...