WPF中ToggleButton绑定IsChecked结合ControlTemplate致应用崩溃问题
问题复现条件
需将ToggleButton放置在TabControl的非首个TabItem中,代码如下:
<TabControl> <TabItem> <Label>Test</Label> </TabItem> <TabItem> <ToggleButton IsChecked="{Binding IsBusy, Mode=TwoWay}" Style="{StaticResource SwitchButton}" /> </TabItem> </TabControl>
自定义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时,ToggleButton可正常切换状态(未选中/选中样式正常)
- 绑定IsChecked到ViewModel的IsBusy属性(双向绑定)后,应用崩溃,错误信息:
System.InvalidOperationException: Name cannot be found in the namescope of System.Windows.Controls.ControlTemplate
尝试的解决方法及新问题
将Storyboard.TargetName改为Storyboard.Target="{Binding ElementName=_Border}"后,应用可正常启动,但点击ToggleButton时,按钮始终保持未选中状态,无法切换。
内容的提问来源于stack exchange,提问作者Nowayout
相关产品推荐
相关产品推荐

