在 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" />