adonis-ui
adonis-ui copied to clipboard
Support TabStripPlacement property for TabControl
Problem
Currently, when we try to put TabStripPlacement="Left", the result is very off.
Solution
It would be awesome if Adonis could handle other TabStripPlacement than "Top".
Alternative
We currently have put a patch in place in our project to detect the TabStripPlacement. Here is the bit of code that we have put in place:
<Style
x:Key="{x:Type TabControl}"
BasedOn="{StaticResource {x:Type TabControl}}"
TargetType="TabControl">
<Style.Triggers>
<Trigger Property="TabStripPlacement" Value="Left">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid KeyboardNavigation.TabNavigation="Local">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TabPanel
x:Name="HeaderPanel"
Grid.Column="0"
Panel.ZIndex="1"
Background="Transparent"
IsItemsHost="True"
KeyboardNavigation.TabIndex="1" />
<Border
x:Name="Border"
Grid.Column="1"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
KeyboardNavigation.DirectionalNavigation="Contained"
KeyboardNavigation.TabIndex="2"
KeyboardNavigation.TabNavigation="Local">
<Border.CornerRadius>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToCornerRadiusConverter.Instance}">
<Binding Source="0" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).TopRight" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).BottomRight" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).BottomLeft" RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</Border.CornerRadius>
<ContentPresenter
x:Name="PART_SelectedContentHost"
Margin="{adonisUi:Space 1,
1,
1,
1}"
ContentSource="SelectedContent" />
</Border>
<Border
x:Name="SelectedItemHighlight"
Grid.Column="1"
Width="4"
Margin="{TemplateBinding BorderThickness}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="{DynamicResource {x:Static adonisUi:Brushes.Layer1HighlightBrush}}">
<Border.CornerRadius>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToCornerRadiusConverter.Instance}">
<Binding Source="0" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).TopRight" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Source="0" />
</MultiBinding>
</Border.CornerRadius>
</Border>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="2">
<Setter TargetName="SelectedItemHighlight" Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer2HighlightBrush}}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="3">
<Setter TargetName="SelectedItemHighlight" Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3HighlightBrush}}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="4">
<Setter TargetName="SelectedItemHighlight" Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer4HighlightBrush}}" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<Style
x:Key="{x:Type TabItem}"
BasedOn="{StaticResource {x:Type TabItem}}"
TargetType="TabItem">
<Setter Property="Padding" Value="8" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=TabStripPlacement}" Value="Left">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Grid x:Name="OuterGrid" Height="30">
<Border
x:Name="Border"
Padding="4"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}">
<Border.BorderThickness>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToThicknessConverter.Instance}">
<Binding Path="BorderThickness.Left" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="BorderThickness.Top" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Path="BorderThickness.Bottom" RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</Border.BorderThickness>
<Border.CornerRadius>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToCornerRadiusConverter.Instance}">
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).TopLeft" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).BottomLeft" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
</MultiBinding>
</Border.CornerRadius>
</Border>
<Border
x:Name="SpotlightLayer"
adonisExtensions:CursorSpotlightExtension.MouseEventSource="{Binding RelativeSource={RelativeSource TemplatedParent}}"
Background="{TemplateBinding adonisExtensions:CursorSpotlightExtension.BackgroundBrush}"
BorderBrush="{TemplateBinding adonisExtensions:CursorSpotlightExtension.BorderBrush}">
<Border.BorderThickness>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToThicknessConverter.Instance}">
<Binding Path="BorderThickness.Left" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="BorderThickness.Top" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Path="BorderThickness.Bottom" RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</Border.BorderThickness>
<Border.CornerRadius>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToCornerRadiusConverter.Instance}">
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).TopLeft" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Path="(adonisExtensions:CornerRadiusExtension.CornerRadius).BottomLeft" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
</MultiBinding>
</Border.CornerRadius>
</Border>
<Grid Name="TabPanel" Background="Transparent">
<ContentPresenter
x:Name="ContentSite"
Margin="8,4"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ContentSource="Header"
RecognizesAccessKey="True" />
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="OuterGrid" Property="Margin" Value="0,0,-1,0" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="OuterGrid" Property="Margin" Value="4,0,0,0" />
</Trigger>
<Trigger SourceName="TabPanel" Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1HighlightBrush}}" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1HighlightBorderBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BackgroundBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1IntenseHighlightBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1IntenseHighlightBorderBrush}}" />
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="2" />
<Condition Binding="{Binding IsMouseOver, ElementName=TabPanel}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer2HighlightBrush}}" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer2HighlightBorderBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BackgroundBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer2IntenseHighlightBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer2IntenseHighlightBorderBrush}}" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="3" />
<Condition Binding="{Binding IsMouseOver, ElementName=TabPanel}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3HighlightBrush}}" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3HighlightBorderBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BackgroundBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3IntenseHighlightBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3IntenseHighlightBorderBrush}}" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(adonisExtensions:LayerExtension.ComputedLayer), RelativeSource={RelativeSource Self}}" Value="4" />
<Condition Binding="{Binding IsMouseOver, ElementName=TabPanel}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer4HighlightBrush}}" />
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer4HighlightBorderBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BackgroundBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer4IntenseHighlightBrush}}" />
<Setter Property="adonisExtensions:CursorSpotlightExtension.BorderBrush" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer4IntenseHighlightBorderBrush}}" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
You're right, this should be supported. Putting it on the to do list.