WPF:ToggleButton 的 ControlTemplate 绑定“IsChecked”属性时会导致 App 崩溃

问题描述 投票:0回答:1

编辑:要重现此错误,您必须将 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 时,它保持未选中状态。

wpf
1个回答
0
投票

解决方案是将

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>

类似的问题是这里

© www.soinside.com 2019 - 2024. All rights reserved.