我正在使用带选项卡式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而不是以编程方式构建“可视化树”真的更有效吗?或者我的第二种方法中的性能是否已被移动到整体表单的负载,而不是像第一种方法中那样单击菜单项?
第二种方法肯定表现得更好。有什么想法吗?
答案 0 :(得分:1)
将它声明为xaml并不是更有效率。我认为你认为性能命中已经转移到表单加载是正确的。
如果加载时间过长,可能是在构造函数中做了太多工作。看看你是否可以最小化加载控件期间完成的工作。
否则,如果问题只是用户控件中的大量控件,也许您可以在内存中保留一个完全加载的选项卡,直到它可以使用为止。用户单击菜单项后,将其添加到tabcontrol,然后开始在后台线程中加载新的。
答案 1 :(得分:0)
是的,您将性能命中移动到Window的初始化。即使已折叠,也会显示UserControl
的实例 - 您已将其明确添加到TabControl
。在xaml中打开标记与说new
是一回事。必须构造折叠控件,因为即使您无法在屏幕上看到它或与其交互,其他控件也可以绑定它,代码隐藏可以与实例一起使用。
如果您更喜欢第一种方法,请尝试缓存UserControl
的实例(如果可以,而不是每次都创建一个新实例)。