2010-03-25 17 views
8

Ich habe eine Benutzeroberfläche mit einem ziemlich Standard-Look and Feel. Es hat eine Spalte mit Symbolen auf der linken Seite, die beim Anklicken ein anderes Benutzer-Steuerelement auf der rechten Seite öffnen. Zur Zeit verwende ich separate Steuerelemente für die Auswahlsymbole und die Benutzerkontrollbeschränkung. Ich habe seltsame Fokus-Probleme, die ich müde bin zu versuchen, zu mildern und frage mich, ob ich ein Tabcontrol so aussehen könnte wie meine Benutzeroberfläche (unter der Annahme, dass eine Tab-Steuerung keine Fokusprobleme beim Navigieren auf Tabs hätte).WPF TabControl Styling

Hier ist ein Screenshot der grundlegenden Benutzeroberfläche. Beim Styling geht es hauptsächlich darum, wie die Tabcontrols-Seitenauswahl wie meine Icon-Spalte aussieht. Wer möchte seinen Hut in den Ring werfen, wie ich das mit einer Tabcontrol erreichen könnte? Mein XAML ist an diesem Punkt ziemlich schwach.

alt text http://img413.imageshack.us/img413/8399/directoru.png

+2

Oder es könnte mich fast eine Woche Zeit nehmen, um zu finden, füge ein Beispiel hinzu. Ich hoffe, es hilft. –

+0

@CJBS Es war BrentRobi, das den ursprünglichen Beitrag erstellt hat und das Bild haben würde. Das Beispiel, über das ich gesprochen habe, ist in der Bearbeitung der untenstehenden Antwort. –

+0

@BryanAnderson - Es tut mir leid - Sie haben Recht. Ich tippte '@B' und akzeptierte den ersten Eintrag ohne zu überprüfen. – CJBS

Antwort

17
<TabControl TabStripPlacement="Left"> 
    ... 
</TabControl> 

Dann legen Sie die Symbole in der Header-Eigenschaft der TabItems und die Benutzersteuerelemente in der Content-Eigenschaft. Das wird dich auf halbem Weg dorthin bringen. Wenn Sie das gleiche Aussehen möchten, müssen Sie TabControl und TabItem neu einlesen, indem Sie die aktuelle Vorlage kopieren (verwenden Sie Blend oder ShowMeTheTemplate, um die aktuelle Vorlage zu kopieren) und ändern Sie sie nach Bedarf. Wenn Sie nur diese Eigenschaften ändern, können Sie testen, ob ein TabControl Ihre Fokusprobleme beseitigt.

Edit: Hier ist ein Beispiel-Vorlage, die ziemlich nahe

<Style TargetType="{x:Type TabItem}"> 
    <Setter Property="Background" Value="Transparent" /> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 

       <Border x:Name="PART_Border" Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="LightGray" Margin="2"> 
        <ContentPresenter ContentSource="Header" Margin="2" /> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter TargetName="PART_Border" Property="BorderBrush" Value="Black" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="{x:Type TabControl}"> 
    <Setter Property="TabStripPlacement" Value="Left" /> 
    <Setter Property="Margin" Value="2" /> 
    <Setter Property="Padding" Value="2" /> 
    <Setter Property="Background" Value="White" /> 


    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabControl}"> 
       <Grid ClipToBounds="True" SnapsToDevicePixels="True" KeyboardNavigation.TabNavigation="Local"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Name="ColumnDefinition0" /> 
         <ColumnDefinition Width="0" Name="ColumnDefinition1" /> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" Name="RowDefinition0" /> 
         <RowDefinition Height="*" Name="RowDefinition1" /> 
        </Grid.RowDefinitions> 

        <Border x:Name="HeaderBorder" 
          BorderBrush="Black" 
          BorderThickness="1" 
          CornerRadius="5" 
          Background="#FAFAFA" 
          Margin="0,0,0,5"> 
         <TabPanel IsItemsHost="True" 
            Name="HeaderPanel" 
            Panel.ZIndex="1" 
            KeyboardNavigation.TabIndex="1" 
            Grid.Column="0" 
            Grid.Row="0" 
         /> 
        </Border> 

        <Grid Name="ContentPanel" 
          KeyboardNavigation.TabIndex="2" 
          KeyboardNavigation.TabNavigation="Local" 
          KeyboardNavigation.DirectionalNavigation="Contained" 
          Grid.Column="0" 
          Grid.Row="1"> 
         <Border Background="{TemplateBinding Background}" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           CornerRadius="5"> 
          <ContentPresenter Content="{TemplateBinding SelectedContent}" 
               ContentTemplate="{TemplateBinding SelectedContentTemplate}" 
               ContentStringFormat="{TemplateBinding SelectedContentStringFormat}" 
               ContentSource="SelectedContent" 
               Name="PART_SelectedContentHost" 
               Margin="2" 
               SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
          /> 
         </Border> 
        </Grid> 
       </Grid> 

       <ControlTemplate.Triggers> 
        <Trigger Property="TabControl.TabStripPlacement" Value="Bottom"> 
         <Setter TargetName="HeaderPanel" Property="Grid.Row" Value="1" /> 
         <Setter TargetName="ContentPanel" Property="Grid.Row" Value="0" /> 
         <Setter TargetName="RowDefinition0" Property="RowDefinition.Height" Value="*" /> 
         <Setter TargetName="RowDefinition1" Property="RowDefinition.Height" Value="Auto" /> 
         <Setter TargetName="HeaderBorder" Property="FrameworkElement.Margin" Value="0,5,0,0" /> 
        </Trigger> 
        <Trigger Property="TabControl.TabStripPlacement" Value="Left"> 
         <Setter TargetName="HeaderPanel" Property="Grid.Row" Value="0" /> 
         <Setter TargetName="ContentPanel" Property="Grid.Row" Value="0" /> 
         <Setter TargetName="HeaderPanel" Property="Grid.Column" Value="0" /> 
         <Setter TargetName="ContentPanel" Property="Grid.Column" Value="1" /> 
         <Setter TargetName="ColumnDefinition0" Property="ColumnDefinition.Width" Value="Auto" /> 
         <Setter TargetName="ColumnDefinition1" Property="ColumnDefinition.Width" Value="*" /> 
         <Setter TargetName="RowDefinition0" Property="RowDefinition.Height" Value="*" /> 
         <Setter TargetName="RowDefinition1" Property="RowDefinition.Height" Value="0" /> 
         <Setter TargetName="HeaderBorder" Property="FrameworkElement.Margin" Value="0,0,5,0" /> 
        </Trigger> 
        <Trigger Property="TabControl.TabStripPlacement" Value="Right"> 
         <Setter TargetName="HeaderPanel" Property="Grid.Row" Value="0" /> 
         <Setter TargetName="ContentPanel" Property="Grid.Row" Value="0" /> 
         <Setter TargetName="HeaderPanel" Property="Grid.Column" Value="1" /> 
         <Setter TargetName="ContentPanel" Property="Grid.Column" Value="0" /> 
         <Setter TargetName="ColumnDefinition0" Property="ColumnDefinition.Width" Value="*" /> 
         <Setter TargetName="ColumnDefinition1" Property="ColumnDefinition.Width" Value="Auto" /> 
         <Setter TargetName="RowDefinition0" Property="RowDefinition.Height" Value="*" /> 
         <Setter TargetName="RowDefinition1" Property="RowDefinition.Height" Value="0" /> 
         <Setter TargetName="HeaderBorder" Property="FrameworkElement.Margin" Value="5,0,0,0" /> 
        </Trigger> 
        <Trigger Property="UIElement.IsEnabled" Value="False"> 
         <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Es ist im Grunde eine Kopie des normalen TabControl zu Ihrem Screenshot sollte mit einigen Grenzen hinzugefügt und entfernt werden. Ich hoffe, das hilft.

+0

Danke für die Antwort. Es ist wirklich das Re-Templat, nach dem ich Rat suche. Es ist der Teil, von dem ich wirklich denke, dass er dies verhindern könnte, eine brauchbare Lösung zu sein. – BrettRobi

+0

Ich kann ein Beispiel veröffentlichen, wenn ich in ein paar Stunden nach Hause komme. –

+0

Brett, ich nehme an, Sie werden feststellen, dass das Nachspielen nicht so schlimm sein wird. Es klingt beängstigend, aber wenn man erst einmal hineinkommt, macht es irgendwie Spaß. Wenn Sie die alte Vorlage verwenden, können Sie im schlimmsten Fall immer von vorne anfangen. –

1

Wie wäre das TabControl mit einem DockPanel temlating, und der Bindung des DockPanel.Dock des TabPanel zur ursprünglichen TabStripPlacement Eigenschaft? .. wie

gezeigt
xaml 
<Style TargetType="{x:Type TabControl}" > 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabControl}"> 
        <DockPanel KeyboardNavigation.TabNavigation="Local" LastChildFill="True"> 
         <TabPanel DockPanel.Dock="{TemplateBinding TabStripPlacement}" 
          Name="HeaderPanel" 
          Grid.Row="0" 
          Panel.ZIndex="1" 
          Margin="0,0,4,1" 
          IsItemsHost="True" 
          KeyboardNavigation.TabIndex="1" 
          Background="Transparent" /> 
         <Border 
          Name="Border" 
          Background="Transparent" 
          BorderBrush="Black" 
          BorderThickness="1" 
          CornerRadius="2" > 
          <ContentPresenter 
           ContentSource="SelectedContent" /> 
         </Border> 
        </DockPanel> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" Value="False"> 
          <Setter Property="Foreground" Value="Black" /> 
          <Setter TargetName="Border" Property="BorderBrush" Value="DarkGray" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>