2013-05-11 2 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> 

어떻게 내가 새 탭을 생성 할 때마다 그때 간단하게 호출 할 수 있도록이 서식 파일을 저장합니까 : 각각의 탭은 다음과 같은 형태를 가질 것인가?

코드로 레이아웃을 만들려면 각 컨트롤의 새 인스턴스를 만들고 새 TabItem에 추가 한 다음이 TabItem을 TabControl에 추가하는 등의 NewTabItem() 함수를 만듭니다 (예 : 의사 코드) :

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

는 UserControl이 같은 별도의 .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

+0

내 프로젝트에서 비슷한 일을하려 할 때, 탭은 그 안에 텍스트 블록이있는 격자 대신 탭 내용 영역에'System.Windows.Controls.Grid'를 표시하고 있습니다. 어떤 아이디어? – Anthony