自定义切换开关中的OffContent / OnContent不适合一行,因为它在网格(放置ToggleSwitch的位置)中具有自定义文本和单元格不够宽。
Off / OnContent超出了ToggleSwitch元素的边界,即使我为OffContentTemplate和OnContentTemplate定义了自定义模板,也是如此
<DataTemplate x:Key="ToggleSwitchTextBlockTemplate">
<TextBlock
TextWrapping="Wrap"
Text="{Binding}"
HorizontalAlignment="Stretch" />
</DataTemplate>
<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}"
Width="200" />
如何强制Off / OnContent包装并适应ToggleSwitch边界?
在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>