Skip to content

Commit 8dcbed5

Browse files
committed
Add IsSelectedItemBold property to TabStrip
1 parent 1e49b25 commit 8dcbed5

3 files changed

Lines changed: 53 additions & 48 deletions

File tree

src/Wpf.Ui.Test/MainWindow.xaml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
Width="1200"
1616
Height="760"
1717
d:Background="#232323"
18-
d:Height="2400"
18+
d:Height="15000"
1919
ExtendsContentIntoTitleBar="True"
2020
WindowBackdropType="Mica"
2121
WindowStartupLocation="CenterScreen"
@@ -4792,9 +4792,11 @@
47924792
</StackPanel>
47934793
</ui:StackPanel>
47944794

4795-
<!-- ═══════════════════════════════════════════════════════════
4796-
TabStrip
4797-
═══════════════════════════════════════════════════════════ -->
4795+
<!--
4796+
═══════════════════════════════════════════════════════════
4797+
TabStrip
4798+
═══════════════════════════════════════════════════════════
4799+
-->
47984800
<TextBlock
47994801
Margin="0,24,0,0"
48004802
FontSize="14"
@@ -4880,9 +4882,9 @@
48804882
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
48814883
Text="ItemsSource binding (Button style)" />
48824884
<vio:TabStrip
4883-
Style="{DynamicResource ButtonTabStripStyle}"
48844885
ItemsSource="{Binding TabItems}"
4885-
SelectedItem="{Binding SelectedTab, Mode=TwoWay}" />
4886+
SelectedItem="{Binding SelectedTab, Mode=TwoWay}"
4887+
Style="{DynamicResource ButtonTabStripStyle}" />
48864888
</StackPanel>
48874889

48884890
</StackPanel>

src/Wpf.Ui.Violeta/Controls/TabStrip/TabStrip.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ namespace Wpf.Ui.Violeta.Controls;
1818
/// </remarks>
1919
public class TabStrip : ListBox
2020
{
21+
public static readonly DependencyProperty IsSelectedItemBoldProperty = DependencyProperty.Register(
22+
nameof(IsSelectedItemBold),
23+
typeof(bool),
24+
typeof(TabStrip),
25+
new FrameworkPropertyMetadata(false));
26+
27+
public bool IsSelectedItemBold
28+
{
29+
get => (bool)GetValue(IsSelectedItemBoldProperty);
30+
set => SetValue(IsSelectedItemBoldProperty, value);
31+
}
32+
2133
static TabStrip()
2234
{
2335
DefaultStyleKeyProperty.OverrideMetadata(

src/Wpf.Ui.Violeta/Controls/TabStrip/TabStrip.xaml

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,24 @@
3434
BorderBrush="{TemplateBinding BorderBrush}"
3535
BorderThickness="{TemplateBinding BorderThickness}"
3636
SnapsToDevicePixels="True">
37-
<Grid>
38-
<!-- Ghost: always SemiBold — reserves bold width so item never jumps -->
39-
<ContentPresenter
40-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
41-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
42-
IsHitTestVisible="False"
43-
TextElement.FontWeight="SemiBold"
44-
Visibility="Hidden" />
45-
<ContentPresenter
46-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
47-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
48-
RecognizesAccessKey="True" />
49-
</Grid>
37+
<ContentPresenter
38+
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
39+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
40+
RecognizesAccessKey="True" />
5041
</Border>
5142
<ControlTemplate.Triggers>
5243
<!-- Selected -->
5344
<Trigger Property="IsSelected" Value="True">
5445
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
55-
<Setter Property="FontWeight" Value="SemiBold" />
5646
<Setter Property="BorderBrush" Value="{DynamicResource AccentFillColorDefaultBrush}" />
5747
</Trigger>
48+
<MultiDataTrigger>
49+
<MultiDataTrigger.Conditions>
50+
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
51+
<Condition Binding="{Binding IsSelectedItemBold, RelativeSource={RelativeSource AncestorType={x:Type local:TabStrip}}}" Value="True" />
52+
</MultiDataTrigger.Conditions>
53+
<Setter Property="FontWeight" Value="SemiBold" />
54+
</MultiDataTrigger>
5855
<!-- Hover (not selected) -->
5956
<MultiTrigger>
6057
<MultiTrigger.Conditions>
@@ -165,30 +162,27 @@
165162
BorderThickness="{TemplateBinding BorderThickness}"
166163
CornerRadius="4,4,0,0"
167164
SnapsToDevicePixels="True">
168-
<Grid>
169-
<!-- Ghost: always SemiBold — reserves bold width so item never jumps -->
170-
<ContentPresenter
171-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
172-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
173-
IsHitTestVisible="False"
174-
TextElement.FontWeight="SemiBold"
175-
Visibility="Hidden" />
176-
<ContentPresenter
177-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
178-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
179-
RecognizesAccessKey="True" />
180-
</Grid>
165+
<ContentPresenter
166+
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
167+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
168+
RecognizesAccessKey="True" />
181169
</Border>
182170
<ControlTemplate.Triggers>
183171
<!-- Selected: show 3-sided border + card bg + overlap separator by 1 px -->
184172
<Trigger Property="IsSelected" Value="True">
185173
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
186-
<Setter Property="FontWeight" Value="SemiBold" />
187174
<Setter TargetName="Root" Property="BorderThickness" Value="1,1,1,0" />
188175
<Setter TargetName="Root" Property="Background" Value="{DynamicResource LayerFillColorDefaultBrush}" />
189176
<!-- Extend 1 px below to cover the separator line -->
190177
<Setter TargetName="Root" Property="Margin" Value="0,0,0,-1" />
191178
</Trigger>
179+
<MultiDataTrigger>
180+
<MultiDataTrigger.Conditions>
181+
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
182+
<Condition Binding="{Binding IsSelectedItemBold, RelativeSource={RelativeSource AncestorType={x:Type local:TabStrip}}}" Value="True" />
183+
</MultiDataTrigger.Conditions>
184+
<Setter Property="FontWeight" Value="SemiBold" />
185+
</MultiDataTrigger>
192186
<!-- Hover (not selected) -->
193187
<MultiTrigger>
194188
<MultiTrigger.Conditions>
@@ -251,27 +245,24 @@
251245
BorderThickness="{TemplateBinding BorderThickness}"
252246
CornerRadius="{DynamicResource ControlCornerRadius}"
253247
SnapsToDevicePixels="True">
254-
<Grid>
255-
<!-- Ghost: always SemiBold — reserves bold width so item never jumps -->
256-
<ContentPresenter
257-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
258-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
259-
IsHitTestVisible="False"
260-
TextElement.FontWeight="SemiBold"
261-
Visibility="Hidden" />
262-
<ContentPresenter
263-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
264-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
265-
RecognizesAccessKey="True" />
266-
</Grid>
248+
<ContentPresenter
249+
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
250+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
251+
RecognizesAccessKey="True" />
267252
</Border>
268253
<ControlTemplate.Triggers>
269254
<!-- Selected: accent highlight inside the card shell -->
270255
<Trigger Property="IsSelected" Value="True">
271256
<Setter TargetName="Root" Property="Background" Value="{DynamicResource AccentFillColorDefaultBrush}" />
272257
<Setter Property="Foreground" Value="{DynamicResource TextOnAccentFillColorPrimaryBrush}" />
273-
<Setter Property="FontWeight" Value="SemiBold" />
274258
</Trigger>
259+
<MultiDataTrigger>
260+
<MultiDataTrigger.Conditions>
261+
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
262+
<Condition Binding="{Binding IsSelectedItemBold, RelativeSource={RelativeSource AncestorType={x:Type local:TabStrip}}}" Value="True" />
263+
</MultiDataTrigger.Conditions>
264+
<Setter Property="FontWeight" Value="SemiBold" />
265+
</MultiDataTrigger>
275266
<!-- Hover (not selected) -->
276267
<MultiTrigger>
277268
<MultiTrigger.Conditions>

0 commit comments

Comments
 (0)