在ToggleSwitch 的样式中,有OffContentPresenter 和OnContentPresenter 分别代表OffContent 和OnContent,可以添加TextWrapping 来包裹内容并设置Width 来限制其宽度。关于完整的样式,可以去generic.xaml复制一下。
.xaml:
<Style x:Key="ToggleSwitchStyle1" TargetType="ToggleSwitch">
......
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleSwitch">
<Grid Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{TemplateBinding CornerRadius}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<VisualStateManager.VisualStateGroups>
......
</VisualStateManager.VisualStateGroups>
<ContentPresenter x:Name="HeaderContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Foreground="{ThemeResource ToggleSwitchHeaderForeground}" IsHitTestVisible="False" Margin="{ThemeResource ToggleSwitchTopHeaderMargin}" Grid.Row="0" TextWrapping="Wrap" VerticalAlignment="Top" Visibility="Collapsed" x:DeferLoadStrategy="Lazy"/>
<Grid HorizontalAlignment="Left" MinWidth="{StaticResource ToggleSwitchThemeMinWidth}" Grid.Row="1" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition MaxWidth="12" Width="12"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="{ThemeResource ToggleSwitchPreContentMargin}"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="{ThemeResource ToggleSwitchPostContentMargin}"/>
</Grid.RowDefinitions>
<Grid x:Name="SwitchAreaGrid" Background="{ThemeResource ToggleSwitchContainerBackground}" Grid.ColumnSpan="3" Control.IsTemplateFocusTarget="True" Margin="0,5" Grid.RowSpan="3"/>
<ContentPresenter TextWrapping="Wrap" Width="100" x:Name="OffContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding OffContentTemplate}" Content="{TemplateBinding OffContent}" Grid.Column="2" Foreground="{TemplateBinding Foreground}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<ContentPresenter TextWrapping="Wrap" Width="100" x:Name="OnContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding OnContentTemplate}" Content="{TemplateBinding OnContent}" Grid.Column="2" Foreground="{TemplateBinding Foreground}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="False" Opacity="0" Grid.RowSpan="3" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
......
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
或者你也可以在ToggleSwitch的OnContent和OffContent属性中放一个TextBlock来实现。
<ToggleSwitch Width="200" Grid.Row="2" Grid.Column="0" x:Name="SomeToggle"
Header="Some header" >
<ToggleSwitch.OffContent>
<TextBlock Width="100" TextWrapping="Wrap">Off content to verify if string is wrapped</TextBlock>
</ToggleSwitch.OffContent>
</ToggleSwitch>
更新:
如果您不想直接设置 Width 来限制其宽度,您可以将 ColumnDefinition 从“Auto”更改为“*”。 “自动”意味着一列的宽度与其内的元素一样多。但是“*”是基于剩余空间的宽度。所以当你将 ColumnDefinition 设置为“ * ”时,它会根据剩余的空间来放置你的文本,如果不够就会换行。
需要修改的样式部分是(你只需要从原来的样式更改以下部分):
<Grid HorizontalAlignment="Left" MinWidth="{StaticResource ToggleSwitchThemeMinWidth}" Grid.Row="1" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition MaxWidth="12" Width="12"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
......
</Grid>
用法:
<ToggleSwitch
Grid.Row="2"
Grid.Column="0"
x:Name="SomeToggle"
Header="Some header"
OffContent="Off content to verify if string is wrapped"
OnContent="On content to verify if string is wrapped"
OffContentTemplate="{StaticResource ToggleSwitchTextBlockTemplate}"
OnContentTemplate="{StaticResource ToggleSwitchTextBlockTemplate}"
Style="{StaticResource ToggleSwitchStyle1}"
Width="200" />