c# - 根据背景颜色更改按钮的鼠标悬停颜色

标签 c# wpf

我一直在试图弄清楚如何更改按钮的悬停颜色,我发现 this :

但这只是我想要实现的目标的一半。我想根据当前背景颜色更改悬停颜色。即

默认按钮背景颜色:灰色

我点击它,按钮的背景颜色将变成红色。悬停颜色应更改为粉红色。

我再次单击它,按钮的背景颜色将变为绿色。悬停颜色应更改为浅绿色。

这在标记和代码隐藏中可能吗?怎么办?

最佳答案

XAML:

<Button Content="Color change" Background="{Binding BackGround}" Command="{Binding ButtonPressedCommand}">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Border Name="Border" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background, Mode=OneWay}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="Border" 
                                Value="{Binding BackGroundOnHover}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="False">
                        <Setter Property="Background" TargetName="Border" 
                                Value="{Binding BackGround}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
    </Button>

View 模型:

class MainViewModel : INotifyPropertyChanged
    {
        private Brush _backGround = new SolidColorBrush(Colors.Red);

        public Brush BackGround
        {
            get { return _backGround; }
            set
            {
                _backGround = value;
                OnPropertyChanged();
            }
        }

        private Brush _backGroundOnHover;
        public Brush BackGroundOnHover
        {
            get
            {
              if (_backGroundOnHover == null)
                    SetHoverBackGround();
                Debug.WriteLine(((SolidColorBrush)_backGroundOnHover).Color.R);
                return _backGroundOnHover;
            }
            set
            {
                _backGroundOnHover = value;
                OnPropertyChanged();
            }
        }

        private RelayCommand _buttonPressedCommand;

        public RelayCommand ButtonPressedCommand
        {
            get
            {
                return _buttonPressedCommand ??
                       (_buttonPressedCommand = new RelayCommand(SetBackgroundWhenButtonPressed));
            }
        }

        private void SetBackgroundWhenButtonPressed()
        {
            var color = ((SolidColorBrush)BackGround).Color;
            BackGround = new SolidColorBrush(Color.FromRgb((byte)(color.R - 5), color.G, color.B));
            SetHoverBackGround();
        }

        private void SetHoverBackGround()
        {
            var color = ((SolidColorBrush)BackGround).Color;
            BackGroundOnHover = new SolidColorBrush(Color.FromRgb((byte)(255-color.R ), color.G, color.B));
        }


        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

每当您单击时,它都会更改背景颜色,并在鼠标悬停时同时更改颜色。

关于c# - 根据背景颜色更改按钮的鼠标悬停颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347818/

相关文章:

c# - TPL 数据流 block 永远不会在 PropagateCompletion 上完成

c# - 如何从 MasterPage 触发 UpdatePanel 更新?

c# - 如何读取硬盘温度?

wpf - 如何在 MVVM 中将标志枚举绑定(bind)到 ListBox

c# - WPF中的绑定(bind)问题——属性和字段的区别

java - 为什么省略花括号被认为是一种不好的做法?

c# - Mysql 连接的连接字符串

wpf 扩展工具包 BusyIndi​​cator 绑定(bind)到属性

c# - 每次选择新的 comboboxItem 时如何运行不同的方法

c# - WPF - namespace 中不存在名称