Wpf Tabcontrol-选择已更改加载/卸载

Wpf Tabcontrol-选择已更改加载/卸载,wpf,layout,tabcontrol,loaded,Wpf,Layout,Tabcontrol,Loaded,这是一个好奇的问题,我对如此昂贵的布局没有实际用途 我有以下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

这是一个好奇的问题,我对如此昂贵的布局没有实际用途

我有以下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();
        }
    }
公共类项目
{
公共FrameworkElement视图{get{return m_View;}}
公共项目()
{
对于(int i=0;i<3000;++i)
{
m_view.Items.Add(newtextbox());
}
}
ItemsControl m_view=新建ItemsControl();
}
公共部分类主窗口:窗口
{
公共列表项{get;private set;}
公共主窗口()
{
项目=新列表();
对于(int i=0;i<10;++i)
{
添加(新项());
}
DataContext=this;
初始化组件();
}
}
所以在初始化窗口之前,所有的文本框都已经构建好了,全部30000个文本框,但是它们还没有被加载。它们仅在更改选择时(例如,在进行初始选择时)才会加载/卸载。由于文本框的数量太多,我希望第一次为每个项目更改选项卡需要一段时间,但为什么在我选择了每个选项卡之后,再次查看它们仍然需要很长时间才能加载/卸载

没有绑定,我不认为这是一个布局问题,因为当我调整窗口大小时,它的更新速度要比更改选项卡之间的更新速度快得多。我不认为这是一个内存问题(东西必须加载和输出),因为内存使用在选择选项卡之间增长,然后在所有10个选项卡都被选择后保持不变,然后再次运行


另外,我有意不使用可视化。

这是TabControl的默认行为,没有简单的方法可以改变它

它会在选项卡变为非活动状态时立即卸载该选项卡的可视树以节省内存,然后在该选项卡再次变为活动状态时重新加载

如果遇到此问题,您有两种选择:

  • 在Multiple sight上有一篇博文,但他们更改了网站,网站不再可用。他们基本上将TabControl子类化,并改变了这种行为,使其缓存选项卡内容。我认为代码保存在这里(或其派生):

  • 另一个选择(在我看来更好)是购买\下载已经这样做的第三方控件。我相信DevExpress TabControl确实会缓存其选项卡,并且在选项卡之间切换时不必重新绘制它们