2014-01-12 41 views
0

這是一個好奇心的問題,我沒有這種昂貴的佈局的實際用途。Tabcontrol - 選擇更改加載/卸載

我有下面的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(); 
     } 
    } 

所以之前被初始化窗口中的所有文本框已經構建了下面的代碼,其中共有30,000,但他們的避風港尚未裝入。當選擇被改變時,例如當初始選擇發生時,它們僅被加載/卸載。由於文本框的數量龐大,我希望第一次爲每個項目更改標籤,但爲什麼在Ive選擇每個標籤之後,再次通過它們在加載/卸載之間仍需要很長時間?

沒有約束力,我認爲它不是一個佈局問題,因爲當我調整窗口的大小時,它的更新速度比改變標籤之間的速度要快得多。我不認爲它是一個內存問題(因爲內存使用量在選擇標籤之間增長,所以內存使用量不斷增加),然後在所有10個選擇完畢後保持不變,然後再次運行。

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

回答

1

這是TabControl的默認行爲,並沒有簡單的方法來改變它。

只要它變爲不活動狀態以保存內存,然後在該選項卡再次激活時將其加載回來,它將卸載選項卡的可視化樹。

如果你確實遇到這個問題,你有兩個選擇:

  1. 有在多個視線的博客文章,但他們改變了他們的網站,它不再可用。他們基本上是對TabControl進行分類並改變這種行爲,以便緩存標籤內容。我認爲代碼保存在這裏(或其衍生物):WPF TabControl - Preventing Unload on Tab Change?

  2. 另一種選擇(我認爲更好)是購買\下載第三方控制已經這樣做。我相信DevExpress TabControl會緩存它的選項卡,並且在切換選項卡時不必重新繪製它們。 http://documentation.devexpress.com/#wpf/CustomDocument7975