DevExpress控制WPF加载时间

时间:2011-06-01 09:34:26

标签: wpf performance controls devexpress

当我使用DevExpress控件来声明它们被声明的窗口的WPF加载时间时增加。但在第二次访问时 - 它加载速度很快。没有办法在程序启动时预加载所有需要的dll /主题(让它需要5-10秒!),但是在整个程序中快速加载它们?我搜索了一下,找到了这样的东西:

    private static void RunTypeInitializers(Assembly a)
    {
        Type[] types = a.GetExportedTypes();
        for (int i = 0; i < types.Length; i++)
        {
            RuntimeHelpers.RunClassConstructor(types[i].TypeHandle);
        }
    }

    private static void PreloadControls()
    {
        ThemeManager.ApplicationThemeName = Theme.Office2007BlueName;

        ThemeManager.SetThemeName(new TextEdit(), Theme.Office2007BlueName);
        ThemeManager.SetThemeName(new TreeListControl(), Theme.Office2007BlueName);

        RunTypeInitializers(Assembly.GetAssembly(typeof(TextEdit)));
        RunTypeInitializers(Assembly.GetAssembly(typeof(TreeListControl)));
        RunTypeInitializers(Assembly.GetAssembly(typeof(BarManager)));

        //GC.KeepAlive(typeof(TreeListControl));
        //GC.KeepAlive(typeof(BarManager));
        //GC.KeepAlive(typeof(TreeListView));
        //GC.KeepAlive(typeof(DevExpress.Xpf.Editors.Settings.MemoEditSettings));
        //GC.KeepAlive(typeof(DevExpress.Xpf.Editors.Settings.TextEditSettings));
    }

但非有帮助。首次加载仍然很长。

1 个答案:

答案 0 :(得分:5)

要解决此问题,我建议您ngen我们的程序集并使用DXSplashWindow(11.1)或手动创建一个类似的窗口,并在主窗体首次打开时显示它。

这种减速是由JIT和主题加载引起的。

RunTypeInitializers只是调用一个对象构造函数。此时不会加载WPF主题,因为只有在即将显示控件并生成可视树时才会发生这种情况。

这个问题的一个可能的解决方案是创建一个不可见的窗口,它将包含我们所有的控件,然后显示和隐藏它。但是,我不喜欢这种方法。在我看来,最好是展示一个启动窗口。