在指针离开按钮之前,背景颜色上的按钮绑定不会更新
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);
当我点击按钮时,IsCollapsed
被 IsCollapsed = !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 大部分是透明的,但带有轻微的黑色或白色色调取决于它是浅色还是深色主题。
我在后面的代码中创建了一个按钮,如下所示:
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);
当我点击按钮时,IsCollapsed
被 IsCollapsed = !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 大部分是透明的,但带有轻微的黑色或白色色调取决于它是浅色还是深色主题。