WPF 切换按钮在选中时不会改变颜色

本文关键字:改变 变颜色 按钮 WPF | 更新日期: 2023-09-27 18:35:33

我正在尝试为 ToggleBox 制作一种样式,以便在单击时它会改变颜色,我已经成功地在鼠标悬停时给了它一个下拉阴影,但由于某种原因,当我单击它而不是进入选中状态时,它停留在鼠标悬停状态。

它的 XAML 是:

        <!--Primary toggle button style-->
    <Style x:Key="PrimaryRoundedToggleButton" TargetType="ToggleButton">
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Width" Value="180"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="Background" Value="#E08827"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="FontSize" Value="15"/>
        <Setter Property="FontWeight" Value="DemiBold"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Border CornerRadius="4" Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ToggleButton">
                            <Border CornerRadius="4" Background="{TemplateBinding Background}">
                                <Border.Effect>
                                    <DropShadowEffect BlurRadius="4" ShadowDepth="3" Direction="300" Opacity="0.5"/>
                                </Border.Effect>
                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ToggleButton">
                            <Border CornerRadius="4" Background="#58585a">
                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

事件处理程序是:

        private void primaryToggleButton_Checked(object sender, RoutedEventArgs e)
    {
        primaryToggleButton.Content = "Restarting...";
        serviceStatusChangeTimeout = Int32.Parse(ConfigurationManager.AppSettings.Get("serviceStatusChangeTimeout"));
        websiteStatusChangeTimeout = Int32.Parse(ConfigurationManager.AppSettings.Get("websiteStatusChangeTimeout"));
        MidTier.ServiceRestart(serviceStatusChangeTimeout);
        Thread.Sleep(1000);
        cacheBuilderStatus.Source = new BitmapImage(new Uri("pack://application:,,,/WpfCustomControlLibrary1;component/Resources/checkbox-complete.png"));
        MidTier.CheckLastModified();
        MidTier.webSiteRestart();
        MidTier.applicationPoolRecycle();
        primaryToggleButton.IsChecked = false;
    }

我也在尝试让它更改按钮中的文本,但我记得在 XAML 中找到了如何做到这一点,所以我会在问这个问题之前尝试再次挖掘它。

谢谢。

WPF 切换按钮在选中时不会改变颜色

因此,您的按钮将保持鼠标悬停状态,因为当鼠标未悬停时没有触发器(<Trigger Property="IsMouseOver" Value="false"><!--reset things--></Trigger>)。 由于您必须有多个触发器,并且打开和关闭,您可能需要查看MultiDataTrigger。 目前你不需要,但我看到它可能很快就会。

如何在 WPF 中为数据触发提供多个条件?

IsMouseOver 的值为 false 时,您应该执行触发器。

此外,我建议您覆盖模板并执行所需的操作:

    <Setter Property="Template">
    ...
    </ControlTemplate>

并为您的触发器标记ControlTemplate.Triggers