WPF性能加载用户控件

时间:2011-07-14 01:25:13

标签: wpf performance user-controls wpf-controls

我正在使用带选项卡式MDI界面的WPF应用程序。基本上,用户单击菜单项,这将创建并添加新选项卡。创建一个新的“MyUserControl”并将其设置为选项卡的内容。像这样:

    private void MenuItem_OnClick(object sender, RoutedEventArgs e)
    {
        this.TabControl.Items.Add(new TabItem() { Content = new MyUserControl() });
    }

MyUserControl由几个嵌套控件(大约8个控件)组成。当这种方法与实际控制相连时,性能是不可接受的。

除非我失去理智,否则我注意到,在提前宣布xaml中的标签和内容并简单地切换标签项的Visibility属性时,性能提升似乎要小得多:

    <Controls:TabControl x:Name="TabControl" Grid.Row="1">
        <Controls:TabControl.Items>
            <Controls:TabItem x:Name="MyTabItem" Visibility="Collapsed">
                <Controls:MyUserControl x:Name="MyUserControl" />
            </Controls:TabItem>
        </Controls:TabControl.Items>
    </Controls:TabControl>

    private void MenuItem_OnClick(object sender, RoutedEventArgs e)
    {
        this.MyTabItem.Visibility = Visibility.Visible;
    }

任何人都能解释一下吗?在xaml而不是以编程方式构建“可视化树”真的更有效吗?或者我的第二种方法中的性能是否已被移动到整体表单的负载,而不是像第一种方法中那样单击菜单项?

第二种方法肯定表现得更好。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

将它声明为xaml并不是更有效率。我认为你认为性能命中已经转移到表单加载是正确的。

如果加载时间过长,可能是在构造函数中做了太多工作。看看你是否可以最小化加载控件期间完成的工作。

否则,如果问题只是用户控件中的大量控件,也许您可​​以在内存中保留一个完全加载的选项卡,直到它可以使用为止。用户单击菜单项后,将其添加到tabcontrol,然后开始在后台线程中加载新的。

答案 1 :(得分:0)

是的,您将性能命中移动到Window的初始化。即使已折叠,也会显示UserControl的实例 - 您已将其明确添加到TabControl。在xaml中打开标记与说new是一回事。必须构造折叠控件,因为即使您无法在屏幕上看到它或与其交互,其他控件也可以绑定它,代码隐藏可以与实例一起使用。

如果您更喜欢第一种方法,请尝试缓存UserControl的实例(如果可以,而不是每次都创建一个新实例)。