You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中ToggleButton绑定IsChecked结合ControlTemplate致应用崩溃问题

WPF ToggleButton绑定后崩溃及状态切换失效问题

问题复现条件

需将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:45:29