2009-12-08 15 views
23

Wie legen Sie den TabItem.Header auf Bindungen aus wenigen Feldern festgelegt, jede Bindung in einer anderen Größe angezeigt, alle an der Stelle des ursprünglichen Header-Textes ; ohne den Standard-Stil und das Verhalten der Kopfzeile zu überschreiben - ich brauche nur den Text.TabControl.ItemTemplate: Festlegen von TabItem.Header.Text zu einer MultiBinding mit StringFormat

Ich habe versucht, seine Vorlage zu setzen, aber dann erstellt es ein Rechteck, das die inneren Steuerelemente enthält, und dieses Rechteck reagiert nicht auf Benutzer klickt, und haben auch die Steuerelement-Stil, ich möchte diese Steuerelemente unsichtbar sein, nur seine Text sollte sichtbar sein.

Ich habe folgendes versucht:

<TabControl ItemsSource="{Binding}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TabItem> 
       <TabItem.Header> 
        <MultiBinding StringFormat="{}{0}-{1}"> 
         <Binding Path="Title"/> 
         <Binding Path="Category.Title"/> 
        </MultiBinding> 
       </TabItem.Header> 
       <TabItem.Content> 
        <TextBlock> 
         Here is what is gonna be in the TabItem - not header 
        </TextBlock> 
       </TabItem.Content> 
      </TabItem> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
</TabControl> 

Aber es hat nichts zu zeigen.

Ich habe auch versucht, die HeaderTemplate auf eine DataTemplate zu setzen, aber was passiert ist, überschreibt die DataTemplate den TabItem Stil und wenn ich auf den Text klicke, geht es nicht auf die angeklickte Registerkarte, außerdem sehen die nicht ausgewählten Tabs sehr aus Komisch, ich sehe das Rechteck des Textes schweben, während ich es transparent haben möchte.

Also, um meine Frage zusammenzufassen, möchte ich TabItem.Header.Text auf eine MultiBinding mit StringFormat setzen.

+3

Ich gab diese Frage vor Stunden schon fast die gleiche Antwort. Aber es scheint, die Frage wurde gelöscht und neu veröffentlicht? – Dabblernl

+0

Warum haben Sie die vorherige Version dieser Frage gelöscht? Warum änderst du nicht einfach das, was du fragst, und hinterlässt dazu Kommentare, dann lässt du die Antworten wissen, dass sie das Ziel verfehlt haben, Vers, die ihre Arbeit zerstören? –

Antwort

61

Das TabControl enthält eine ContentTemplate-Eigenschaft sowie die ItemTemplate, die ItemsControl erbt. Es verwendet das ContentTemplate, um zu unterscheiden, was im Inhaltsbereich angezeigt wird, während ItemTemplate die Vorlage für den Header definiert. Darüber hinaus wird jedes Element aus Ihrer ItemSource automatisch in ein TabItem eingeschlossen. Es muss nicht erneut in ItemTemplate erstellt werden, da dies versucht, ein TabItem in den Header zu platzieren, wie Sie bemerken.

Anstatt ein TabItem in der ItemTemplate neu zu erstellen, verwenden Sie die ItemTemplate, um Ihren Header-Inhalt zu definieren, und die ContentTemplate, um Ihren Inhalt zu definieren.

In Ihrem ersten Absatz haben Sie erwähnt, dass Sie verschiedene Größen an den gebundenen Teilen des Headers festlegen möchten. Wenn Sie dies tun möchten, können Sie nicht einen einzelnen Binding oder MultiBinding verwenden, um den Text wie oben beschrieben zu setzen. Stattdessen können Sie TextBlocks verschachteln, um dies mit jeweils unterschiedlicher Formatierung zu erreichen.

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock Text="{Binding Title}" 
         FontSize="12" /> 
      <Run Text="--" /> 
      <TextBlock Text="{Binding Category.Title}" 
         FontSize="10" /> 
     </TextBlock> 
    </DataTemplate> 
</TabControl.ItemTemplate> 
+0

Was sind die Style TargetTypes für diese? Ich weiß, TabItem ist für den Button, aber was ist mit der Seite? – Patrick

+0

Das war wirklich eine sehr knifflige Sache. +1 –

Verwandte Themen