这是一个好奇的问题,我对这种昂贵的布局没有实际用途。
我有以下Xaml
<Window x:Class="WpfApplication16.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowStartupLocation="CenterScreen">
<TabControl ItemsSource="{Binding Items}">
<TabControl.ContentTemplate>
<DataTemplate>
<ScrollViewer>
<ContentPresenter Content="{Binding View}" />
</ScrollViewer>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Window>
以及后面的代码
public class Item
{
public FrameworkElement View { get { return m_view; } }
public Item()
{
for (int i = 0; i < 3000; ++i)
{
m_view.Items.Add(new TextBox());
}
}
ItemsControl m_view = new ItemsControl();
}
public partial class MainWindow : Window
{
public List<Item> Items { get; private set; }
public MainWindow()
{
Items = new List<Item>();
for (int i = 0; i < 10; ++i)
{
Items.Add(new Item());
}
DataContext = this;
InitializeComponent();
}
}
所以在窗口初始化之前,所有TextBox都已经构建完了,所有这些TextBox都有30,000个,但它们尚未加载。它们仅在更改选择时加载/卸载,例如在进行初始选择时。由于文本框的数量庞大,我希望第一次为每个项目更改标签需要一段时间,但为什么在选择每个标签后再次浏览它们仍然需要很长时间才能加载/卸载?
没有绑定,我不认为它是一个布局问题,因为当我调整窗口大小时,它比更改选项卡之间更快地更新。我不认为它是一个内存问题(必须加载和输出的东西),因为内存使用量在选择选项卡之间增长,然后在选择所有10个之后保持不变,并再次运行。
此外,我故意不使用可视化。
答案 0 :(得分:1)
这是TabControl的默认行为,没有简单的方法可以改变它。
它一旦变为非活动状态就会卸载选项卡的可视树以保存内存,然后在选项卡再次激活时将其加载回来。
如果遇到此问题,您有两种选择:
有一篇关于复数视频的博客文章,但是他们改变了他们的网站并且它已经不再可用了。它们基本上是TabControl的子类,并改变了这种行为,因此它缓存了选项卡内容。我认为代码保存在这里(或其衍生物):WPF TabControl - Preventing Unload on Tab Change?
另一种选择(在我看来更好)是购买\下载已经这样做的第三方控件。我相信DevExpress TabControl会缓存其选项卡,而不必在选项卡之间切换时重绘它们。 http://documentation.devexpress.com/#wpf/CustomDocument7975