编辑:要重现此错误,您必须将 ToggleButton 放在“TabControl”的“非第一个”
TabItem
中:],如下所示:
<TabControl>
<TabItem>
<Label>Test</Label>
</TabItem>
<TabItem>
<ToggleButton IsChecked="{Binding IsBusy, Mode=TwoWay}" Style="{StaticResource SwitchButton}" />
</TabItem>
</TabControl>
这是我的自定义
Style
ToggleButton
<Style x:Key="SwitchButton" TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Viewbox>
<Border
x:Name="_Border"
Width="40"
Height="20"
Background="#FFFFFFFF"
CornerRadius="10">
<Border.Effect>
<DropShadowEffect
Direction="0"
Opacity="0.3"
ShadowDepth="0.5" />
</Border.Effect>
<Ellipse
x:Name="_Ellipse"
Margin="2,1,2,1"
HorizontalAlignment="Stretch"
Fill="#FFFFFFFF"
Stretch="Uniform"
Stroke="Gray"
StrokeThickness="0.2">
<Ellipse.Effect>
<DropShadowEffect
BlurRadius="10"
Direction="260"
Opacity="0.3"
ShadowDepth="1" />
</Ellipse.Effect>
</Ellipse>
</Border>
</Viewbox>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Checked">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="_Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="#12a5fd"
Duration="0:0:0.1" />
<ThicknessAnimation
Storyboard.TargetName="_Ellipse"
Storyboard.TargetProperty="Margin"
To="20 1 2 1"
Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Unchecked">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="_Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="White"
Duration="0:0:0.1" />
<ThicknessAnimation
Storyboard.TargetName="_Ellipse"
Storyboard.TargetProperty="Margin"
To="2 1 2 1"
Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
当
IsChecked
未绑定时,它按预期工作:
未选中:
已检查:
但是,当我将
IsChecked
属性绑定到我的视图模型时,应用程序将崩溃。错误消息显示“System.InvalidOperationException:在 System.Windows.Controls.ControlTemplate 的名称范围中找不到名称”。
我发现了一个类似的问题,我按照接受的答案建议,使用
Storyboard.Target
代替:
Storyboard.Target="{Binding ElementName=_Border}"
使用“Storyboard.Target”确实可以消除问题,应用程序可以正常打开。但是,当我检查 ToggleButton 时,它保持未选中状态。
解决方案是将
EventTrigger
中的ControlTemplate
替换为Trigger
:
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="_Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="#12a5fd"
Duration="0:0:0.1" />
<ThicknessAnimation
Storyboard.TargetName="_Ellipse"
Storyboard.TargetProperty="Margin"
To="20 1 2 1"
Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="_Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="White"
Duration="0:0:0.1" />
<ThicknessAnimation
Storyboard.TargetName="_Ellipse"
Storyboard.TargetProperty="Margin"
To="2 1 2 1"
Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
类似的问题是这里