0

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

我有以下 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 都已经构建好了,总共 30,000 个,但它们还没有被加载。它们仅在选择更改时加载/卸载,例如在初始选择发生时。由于文本框的数量庞大,我希望第一次更改每个项目的选项卡需要一段时间,但为什么在我选择了每个选项卡之后,再次浏览它们仍然需要很长时间才能加载/卸载?

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

另外我故意不使用可视化。

4

1 回答 1

1

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

它会在选项卡变为非活动状态时立即卸载它的可视化树以节省内存,然后在选项卡再次变为活动状态时将其加载回来。

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

  1. 有一篇关于复数视觉的博客文章,但他们改变了他们的网站,它不再可用。他们基本上继承了 TabControl 并更改了此行为,因此它缓存了选项卡内容。我认为代码保存在这里(或它的衍生物):WPF TabControl - 防止在选项卡更改时卸载?

  2. 另一种选择(我认为更好)是购买\下载已经这样做的第三方控件。我相信 DevExpress TabControl 确实会缓存其选项卡,并且在您切换选项卡时不必重新绘制它们。http://documentation.devexpress.com/#wpf/CustomDocument7975

于 2014-02-04T22:00:21.060 回答