Skip to content

Commit bfc6080

Browse files
feat(controls): Add LabelPosition property to ToggleSwitch control (#1600)
- Add LabelPosition dependency property to ToggleSwitch class - Support ElementPlacement.Left and ElementPlacement.Right values - Default behavior remains unchanged (label on right, toggle on left) - When LabelPosition is set to Left, label appears on the left side - Update ToggleSwitch template to dynamically adjust layout based on LabelPosition - Add sample demonstration in Wpf.Ui.Gallery ToggleSwitchPage
1 parent c911c3a commit bfc6080

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

src/Wpf.Ui.Gallery/Views/Pages/BasicInput/ToggleSwitchPage.xaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
2020
mc:Ignorable="d">
2121

22-
<Grid Margin="0,0,0,24">
22+
<StackPanel Margin="0,0,0,24">
2323
<controls:ControlExample
2424
Margin="0"
2525
HeaderText="WPF UI toggle switch."
@@ -42,5 +42,17 @@
4242
</Grid>
4343
</controls:ControlExample>
4444

45-
</Grid>
45+
<controls:ControlExample
46+
Margin="0,32,0,0"
47+
HeaderText="ToggleSwitch with LabelPosition property."
48+
XamlCode="&lt;ui:ToggleSwitch Content=&quot;Label on Right&quot; LabelPosition=&quot;Right&quot; /&gt;&#10; &lt;ui:ToggleSwitch Content=&quot;Label on Left&quot; LabelPosition=&quot;Left&quot; /&gt;">
49+
<StackPanel>
50+
<ui:ToggleSwitch
51+
Margin="0,0,0,8"
52+
Content="Label on Right"
53+
LabelPosition="Right" />
54+
<ui:ToggleSwitch Content="Label on Left" LabelPosition="Left" />
55+
</StackPanel>
56+
</controls:ControlExample>
57+
</StackPanel>
4658
</Page>

src/Wpf.Ui/Controls/ToggleSwitch/ToggleSwitch.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// Copyright (C) Leszek Pomianowski and WPF UI Contributors.
44
// All Rights Reserved.
55

6+
using System.Windows;
7+
68
namespace Wpf.Ui.Controls;
79

810
/// <summary>
@@ -26,6 +28,17 @@ public class ToggleSwitch : System.Windows.Controls.Primitives.ToggleButton
2628
new PropertyMetadata(null)
2729
);
2830

31+
/// <summary>Identifies the <see cref="LabelPosition"/> dependency property.</summary>
32+
public static readonly DependencyProperty LabelPositionProperty = DependencyProperty.Register(
33+
nameof(LabelPosition),
34+
typeof(ElementPlacement),
35+
typeof(ToggleSwitch),
36+
new FrameworkPropertyMetadata(
37+
ElementPlacement.Right,
38+
FrameworkPropertyMetadataOptions.AffectsArrange | FrameworkPropertyMetadataOptions.AffectsMeasure
39+
)
40+
);
41+
2942
/// <summary>
3043
/// Gets or sets the content that should be displayed when the <see cref="ToggleSwitch"/> is in the "Off" state.
3144
/// </summary>
@@ -45,4 +58,15 @@ public object? OnContent
4558
get => GetValue(OnContentProperty);
4659
set => SetValue(OnContentProperty, value);
4760
}
61+
62+
/// <summary>
63+
/// Gets or sets the position of the label content relative to the toggle switch.
64+
/// </summary>
65+
[System.ComponentModel.Bindable(true)]
66+
[System.ComponentModel.Category("Layout")]
67+
public ElementPlacement LabelPosition
68+
{
69+
get => (ElementPlacement)GetValue(LabelPositionProperty);
70+
set => SetValue(LabelPositionProperty, value);
71+
}
4872
}

src/Wpf.Ui/Controls/ToggleSwitch/ToggleSwitch.xaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<Setter Property="Padding" Value="{StaticResource ToggleSwitchPadding}" />
3333
<Setter Property="HorizontalAlignment" Value="Left" />
3434
<Setter Property="VerticalAlignment" Value="Center" />
35+
<Setter Property="LabelPosition" Value="Right" />
3536
<Setter Property="HorizontalContentAlignment" Value="Left" />
3637
<Setter Property="VerticalContentAlignment" Value="Center" />
3738
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
@@ -43,10 +44,11 @@
4344
<ControlTemplate TargetType="{x:Type controls:ToggleSwitch}">
4445
<Grid Margin="{TemplateBinding Padding}" Background="Transparent">
4546
<Grid.ColumnDefinitions>
46-
<ColumnDefinition Width="Auto" />
47-
<ColumnDefinition Width="*" />
47+
<ColumnDefinition x:Name="ToggleColumn" Width="Auto" />
48+
<ColumnDefinition x:Name="ContentColumn" Width="*" />
4849
</Grid.ColumnDefinitions>
4950
<Grid
51+
x:Name="ToggleGrid"
5052
Grid.Column="0"
5153
Width="{StaticResource ToggleButtonWidth}"
5254
Height="{StaticResource ToggleButtonHeight}">
@@ -114,6 +116,16 @@
114116
TextElement.Foreground="{TemplateBinding Foreground}" />
115117
</Grid>
116118
<ControlTemplate.Triggers>
119+
<Trigger Property="LabelPosition" Value="Left">
120+
<Setter TargetName="ToggleGrid" Property="Grid.Column" Value="1" />
121+
<Setter TargetName="ContentPresenter" Property="Grid.Column" Value="0" />
122+
<Setter TargetName="ContentPresenter" Property="Margin" Value="0,0,8,0" />
123+
</Trigger>
124+
<Trigger Property="LabelPosition" Value="Right">
125+
<Setter TargetName="ToggleGrid" Property="Grid.Column" Value="0" />
126+
<Setter TargetName="ContentPresenter" Property="Grid.Column" Value="1" />
127+
<Setter TargetName="ContentPresenter" Property="Margin" Value="8,0,0,0" />
128+
</Trigger>
117129
<MultiTrigger>
118130
<MultiTrigger.Conditions>
119131
<Condition Property="Content" Value="{x:Null}" />

0 commit comments

Comments
 (0)