10

我有 WPF 窗口,它在 WPF 应用程序中托管时运行良好,但是当我从本机 C++ 应用程序中加载它时,渲染需要很长时间,并且 UI 线程会阻塞,直到它完成。

我窗口上的主要问题是一系列项目控件,用于显示 9 x 12 的图标网格,这些图标代表我系统中组件的状态。

整个项目控件的初始渲染最多需要 14 秒。(在 WPF 应用程序中运行时,这几乎是即时的)

每行都有一个文本标题,单击该标题时会显示每个状态图标的小数据摘要(最大值、最小值、平均值、标准差)。单击此标题最多可能需要 4 秒来呈现摘要,但在我的 WPF 应用程序中是即时的。

是否有任何已知的技巧可以使 WPF 在本机应用程序中很好地执行?

[编辑]

我刚刚尝试使用以下代码从大型 .NET Windows 窗体应用程序启动它:

    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 与所有者一起加载资源时,解决资源的方式是否存在问题?

4

3 回答 3

1

WindowInteropHelper 的文档表明您应该将 HELPER 的句柄设置为您的 c++ 句柄

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

但你似乎在做相反的事情。

于 2013-09-07T23:40:44.513 回答
1

您在帖子中没有提到HwndSourceHwndHost,它们是本机代码之间互操作的受支持方式(在 Win32 中托管 WPF 或反之亦然)。 WindowsInteropHelper不打算支持完整的互操作场景,它的唯一用途是基本上获取 WPF 的句柄Window

这些是一系列很棒的文章,我建议您仔细阅读它们,因为除非范围非常有限,否则您想做的事情不会是微不足道的。

于 2014-07-18T04:12:19.127 回答
0

您可以尝试通过NGEN创建和使用 .NET 程序集的本机图像,这将显着加快速度,尽管我不知道在您的情况下会有多大差异......至少它应该减少加载时间

于 2013-01-22T19:56:00.280 回答