在指针离开按钮之前,背景颜色上的按钮绑定不会更新

Button binding on background color does not update before pointer leaves button

我在后面的代码中创建了一个按钮,如下所示:

btnToggleOpen = new Button();

该按钮位于自定义 UserControl 内,该自定义 UserControl 具有 IsCollapsed 属性。 UserControl 实现 INotifyPropertyChanged 接口并在设置时调用 PropertyChangedEvent

我已经为按钮的背景颜色创建了一个绑定(来源contentp是自定义UserControl):

Binding backgroundBinding = new Binding();
backgroundBinding.Source = contentp;
backgroundBinding.Path = new PropertyPath("IsCollapsed");
backgroundBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
backgroundBinding.Converter = new CollapsedSettingsPanelBackgroundValueConverter();

BindingOperations.SetBinding(contentp.BtnToggleOpen, Button.BackgroundProperty, backgroundBinding);

当我点击按钮时,IsCollapsedIsCollapsed = !IsCollapsed; 切换。背景颜色确实发生了变化,但在我将指针从按钮上移开之前没有变化。当指针位于按钮上方时,按钮的背景颜色似乎变得透明。

为什么鼠标悬停时按钮会变透明?在 C# 中创建按钮时如何覆盖它?

查看 Button Styles and Templates 按钮的默认模板,或者在设计器中选择您的按钮,右键单击,然后选择编辑 Template.Edit 副本...

在 PointerOver 的 VisualState 中,您会看到默认模板将前景和背景值设置为 ButtonPointerOver...ThemeBrushes 的动画,覆盖您设置的背景 属性:

<VisualState x:Name="PointerOver">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPointerOverBackgroundThemeBrush}"/>
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPointerOverForegroundThemeBrush}"/>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>

当您将指针移离按钮时,它会转换回默认状态并恢复为设置值。

您可以通过编辑使用编辑 Template.Edit 副本... 菜单创建的副本来覆盖它。您可能仍希望按钮更改为指示指针位于上方,但您可能希望它更改为与新颜色相关的内容,类似于默认背景是透明的,默认 ButtonPointerOverBackgroundThemeBrush 大部分是透明的,但带有轻微的黑色或白色色调取决于它是浅色还是深色主题。