2016-12-12 7 views
0

Я хочу создать TabItem с одним содержимым ListBox и одним содержимым типа WebBrowser, которое я хочу создать динамически. Я могу правильно добавить заголовок, но я не знаю, как добавить несколько данных в DataTemplate.Как связать несколько содержимого с DataTemplate динамически в WPF?

 private TabItem AddTabItem() 
     { 
      int count = _tabItems.Count; 

     TabItem tab = new TabItem(); 

     tab.Header = string.Format("Tab {0}", count); 
     tab.Name = string.Format("tab{0}", count); 

     WebBrowser wbr = new WebBrowser(); 
     wbr.MaxHeight = 1550; 
     wbr.MaxWidth = 1550; 
     wbr.Navigate("https://google.com"); 
     tab.Content = wbr; 

     //Header Part is working Fine 
     tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate; 

     //I Want to add below commented line in my code for Content 
     // tab.ContentTemplate = tabDynamic.FindResource("TabCont") as DataTemplate; 

     return tab; 
} 



     <TabControl x:Name="tabDynamic" ItemsSource="{Binding}" > 
      <!--SelectionChanged="tabDynamic_SelectionChanged"--> 
      <TabControl.Resources> 
       <DataTemplate x:Key="TabHeader" DataType="TabItem"> 
        <DockPanel> 
         <Button x:Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" Click="btnDelete_Click" CommandParameter="{Binding Name, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"> 
          <Image Source="/delete.gif" Height="11" Width="11"/> 
         </Button> 
         <TextBlock Text="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" /> 

        </DockPanel> 
       </DataTemplate> 

       <DataTemplate x:Key="TabCont" DataType="TabItem"> 

       <!-- ========================== --> 
         <!-- Bind Dynamically --> 
       <!-- one list box--> 
       <!-- Webbrowser--> 
       <!-- ========================== --> 

       </DataTemplate> 
      </TabControl.Resources> 

     </TabControl> 
+0

вы не можете добавить несколько элементов в шаблон данных, вместо этого установите контент в элемент, который его поддерживает, например StacKPanel, Grid, DockPanel и т. Д., Которые вы, кажется, делаете в шаблоне, поэтому ваш вопрос не " смысл – MikeT

ответ

0

Вы должны установить свойство Content TabItem на одну панель. Затем вы можете добавить несколько элементов в эту панель. Какую панель вы должны использовать, зависит от ваших требований к макету. Панели имеют разные характеристики: https://msdn.microsoft.com/en-us/library/ms754152(v=vs.110).aspx.

Вы можете, например, использовать DockPanel:

private TabItem AddTabItem() 
    { 
     int count = _tabItems.Count; 

     TabItem tab = new TabItem(); 

     tab.Header = string.Format("Tab {0}", count); 
     tab.Name = string.Format("tab{0}", count); 

     WebBrowser wbr = new WebBrowser(); 
     wbr.MaxHeight = 1550; 
     wbr.MaxWidth = 1550; 
     wbr.Navigate("https://google.com"); 
     DockPanel.SetDock(wbr, Dock.Bottom); 

     ListBox listBox = new ListBox(); 

     DockPanel dockPanel = new DockPanel(); 
     dockPanel.Children.Add(wbr); 
     dockPanel.Children.Add(listBox); 
     tab.Content = dockPanel; 

     tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate; 

     return tab; 
    } 

<TabControl x:Name="tabDynamic"> 
     <TabControl.Resources> 
      <DataTemplate x:Key="TabHeader" DataType="TabItem"> 
       <DockPanel> 
        <Button x:Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" 
          CommandParameter="{Binding Name, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"> 
         <Image Source="/delete.gif" Height="11" Width="11"/> 
        </Button> 
        <TextBlock Text="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" /> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.Resources> 
    </TabControl> 

Так как вы хотите, чтобы создать элементы динамически не имеет смысла использовать DataTemplate для них.