2013-05-11 55 views
0

我正在嘗試創建一個WPF選項卡式窗口,其中將包含動態數量的選項卡。但是,每個選項卡的格式都相同,並且包含相同的控件(不是相同的實例,而是同一類控件)。每個選項卡將具有以下形式:在xaml中創建一個選項卡模板

<TabItem> 
     <TabItem.Header> 
      <TextBlock>C1</TextBlock> 
     </TabItem.Header> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"></RowDefinition> 
       <RowDefinition Height="Auto"></RowDefinition> 
       <RowDefinition Height="Auto"></RowDefinition> 
       <RowDefinition Height="Auto"></RowDefinition> 
       <RowDefinition Height="Auto"></RowDefinition> 
       <RowDefinition Height="Auto"></RowDefinition> 
      </Grid.RowDefinitions> 

      <Grid Grid.Row="1" Grid.Column="0"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
        <ColumnDefinition></ColumnDefinition> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 
       <Label Grid.Column="0">Ancorage</Label> 
       <ComboBox Grid.Column="1" Width="65" SelectedIndex="1"> 
        <ComboBoxItem>Active</ComboBoxItem> 
        <ComboBoxItem>Passive</ComboBoxItem> 
       </ComboBox> 

       <Label Grid.Column="3" HorizontalAlignment="Right">Ancorage</Label> 
       <ComboBox Grid.Column="4" Width="65" HorizontalAlignment="Right"> 
        <ComboBoxItem>Active</ComboBoxItem> 
        <ComboBoxItem>Passive</ComboBoxItem> 
       </ComboBox> 
      </Grid> 
      <Grid Grid.Row="2"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
        <ColumnDefinition Width="Auto"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 
       <Label Grid.Column="0"># Sections</Label> 
       <xctk:IntegerUpDown Grid.Column="1" Minimum="3" Value="3" ></xctk:IntegerUpDown> 
      </Grid> 
     </Grid> 
    </TabItem> 

如何保存該模板,這樣我可以那麼只需調用它,每當我想創建一個新的標籤?如果我要通過代碼創建佈局,我會創建一個函數NewTabItem(),它將創建每個控件的新實例,將它們添加到新的TabItem,然後將此TabItem添加到TabControl,例如(僞代碼):

void NewTabItem() 
{ 
    Combobox box1 = new Combobox(); 
    Combobox box2 = new Combobox(); 
    //... etc 
    TabItem tab = new TabItem(); 
    tab.Add(box1); 
    tab.Add(box2); 
    tabControl.Add(tab); 
} 

這樣每個控件都是一個新的實例,並且將任何這些添加到tabControl中應該沒有問題。我如何使用XAML來做這樣的事情?通過ControlTemplate?從我看到的更多的是控制個體控制的美學,而不是控制的集合。通過ItemsControl?這一個我根本無法弄清楚如何在XAML中定義以及如何召喚一個新的實例來添加到tabControl(或者我將它添加到tabControl中)。

通過其他方法?這甚至可以完成,或者我應該以編程方式構建此佈局?

回答

3

在一個單獨的.xaml定義你的標籤佈局的用戶控件:

<UserControl x:Class="MyProject.MyTab" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     ... 
    </Grid> 
</UserControl> 

這樣,你仍然可以輕鬆地設計它。添加新標籤很容易。

<TabControl Name="Tabs"> 
    <TabItem> 
     <TabItem.Header> 
      <TextBlock>C1</TextBlock> 
     </TabItem.Header> 
     <local:MyTab/> 
    </TabItem> 
    <TabItem> 
     <TabItem.Header> 
      <TextBlock>C2</TextBlock> 
     </TabItem.Header> 
     <local:MyTab/> 
    </TabItem> 
</TabControl> 

如果您選擇以編程方式添加新的選項卡,它只是:

var item = new TabItem 
{ 
    Header = "C", 
    Content = new MyTab() 
}; 
Tabs.Items.Add(item); 
+0

非常感謝,這就像一個魅力的工作! – Wasabi 2013-05-11 22:22:49

+0

當我試圖在我的項目中做類似的事情時,該選項卡在選項卡內容區域中顯示'System.Windows.Controls.Grid',而不是在其中具有文本塊的網格。有任何想法嗎? – Anthony 2014-08-28 06:11:15

相關問題