Проблемы с производительностью при размещении формы WPF в приложении С++

У меня есть окно WPF, которое отлично работает при размещении в приложении WPF, но когда я загружаю его из моего собственного приложения на С++, для рендеринга требуется очень много времени, а поток пользовательского интерфейса блокируется до его завершения.

Основным нарушителем в моем окне является серия элементов управления элементами, используемыми для отображения сетки из 9 на 12, которые представляют состояния компонентов внутри моей системы.

Управление всеми элементами занимает до 14 секунд для его первоначального рендеринга. (Это почти мгновенно при запуске в приложении WPF)

Каждая строка имеет текстовый заголовок, который при нажатии показывает небольшую сводку данных (max, min, mean, std dev) для каждого из значков состояния. щелчок по этому заголовку может занять до 4 секунд, чтобы сделать резюме, но мгновенно в моем приложении WPF.

Существуют ли какие-либо известные трюки для того, чтобы WPF выполнялся в собственном приложении?

[изменить]

Я только что попробовал запустить его из большого приложения форм Windows.NET, используя следующий код:

    public bool? ShowWpfDialog(System.Windows.Window window, Form owner)
    {
        var helper = new System.Windows.Interop.WindowInteropHelper(window)
                         {Owner = (owner == null) ? IntPtr.Zero : owner.Handle};
        return window.ShowDialog();
    }

У меня такие же проблемы с производительностью, как при запуске из собственного приложения. (приложение .net также запускает собственный код.)

[изменить]

Когда я не использую WindowInteropHelper, код работает правильно:

    public bool? ShowWpfDialog(System.Windows.Window window, Form owner)
    {
        //var helper = new System.Windows.Interop.WindowInteropHelper(window)
        //                 {Owner = (owner == null) ? IntPtr.Zero : owner.Handle};
        return window.ShowDialog();
    }

Что делает WindowInteropHelper, что может вызвать проблемы с производительностью?

[изменить]

Может ли быть проблема с тем, как ресурсы решаются, когда я загружаю его владельцем с помощью WindowInteropHelper?

Ответ 1

Документы для WindowInteropHelper указывают, что вы должны установить дескриптор HELPER для вашего дескриптора С++

WindowInteropHelper wih = new WindowInteropHelper(myDialog);
wih.Owner = ownerHwnd;
myDialog.ShowDialog();

Но вы, кажется, делаете обратное.

Ответ 2

Нигде в вашем посте вы не упоминаете HwndSource или HwndHost, которые являются поддерживаемыми средствами взаимодействия между собственным кодом (либо с размещением WPF в Win32, либо наоборот). WindowsInteropHelper не предназначен для поддержки полномасштабных сценариев взаимодействия, он используется только для того, чтобы в основном получить дескриптор WPF Window.

Эти - отличная серия статей, и я рекомендую посмотреть их, потому что то, что вы хотите сделать, не будет тривиальным, если только оно не будет очень ограниченный охват.

Ответ 3

вы можете попробовать создать и использовать собственные образы вашей .NET-сборки через NGEN, это значительно ускорит работу, хотя я не знаю, как большая разница будет в вашем случае... по крайней мере, это должно сократить время загрузки