C# WPF按钮背景在单击时更改,并在同一StackPanel中的另一个按钮单击时重置为原始。

C# WPF按钮背景在单击时更改,并在同一StackPanel中的另一个按钮单击时重置为原始。,c#,wpf,xaml,C#,Wpf,Xaml,我有一个带几个按钮的面板。我想在单击按钮时更改按钮的颜色,并在单击StackPanel中的另一个按钮时将其重置为原始颜色。是否可以在StackPanel上应用单个样式,或者我必须为每个按钮创建样式?如果是,那么怎么做 下面是应用于StackPanel的样式代码,但这会更改按钮的颜色,但不会在单击另一个按钮时将其重置 <Style TargetType="StackPanel" x:Key="GlobalStackPanelStyle" BasedOn="{StaticResource Fl

我有一个带几个按钮的面板。我想在单击按钮时更改按钮的颜色,并在单击StackPanel中的另一个按钮时将其重置为原始颜色。是否可以在StackPanel上应用单个样式,或者我必须为每个按钮创建样式?如果是,那么怎么做

下面是应用于StackPanel的样式代码,但这会更改按钮的颜色,但不会在单击另一个按钮时将其重置

<Style TargetType="StackPanel" x:Key="GlobalStackPanelStyle" BasedOn="{StaticResource FlatStackPanel}">
      <Style.Resources>
            <Style TargetType="Button">
                <Setter Property="Button.Background" Value="Blue"/>
                <Style.Triggers> 
                    <Trigger Property="IsPressed" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" To="Green"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>                           
                    </Trigger>                        
                </Style.Triggers>
            </Style>
        </Style.Resources>
    </Style>

很抱歉延迟回复。以下是获得所需输出所需的步骤

假设您遵循MVVM设计模式

在.xaml中创建按钮,并将命令绑定到每个按钮,如下所示

     <Button Height="32" Width="180" Grid.Column="1" Content="Button 1"
             Command="{Binding ClickCommand}" CommandParameter="Button 1">
         <Button.Style>
             <Style TargetType="{x:Type Button}">
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding IsButton1Active}" Value="True">
                         <Setter Property="Background" Value="Green" />
                         <Setter Property="Foreground" Value="White" />
                     </DataTrigger>
                     <DataTrigger Binding="{Binding IsButton1Active}" Value="False">
                         <Setter Property="Background" Value="Red" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </Button.Style>
     </Button>

     <Button Height="32" Width="180" Grid.Column="2" Content="Button 2"
             Margin="5,0,0,0" 
             Command="{Binding ClickCommand}" CommandParameter="Button 2">
         <Button.Style>
             <Style TargetType="{x:Type Button}">
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding IsButton2Active}" Value="True">
                         <Setter Property="Background" Value="Green" />
                         <Setter Property="Foreground" Value="White" />
                     </DataTrigger>
                     <DataTrigger Binding="{Binding IsButton2Active}" Value="False">
                         <Setter Property="Background" Value="Red" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </Button.Style>
     </Button>
下面是命令的代码-将其添加到ViewModel中

 private UICommand _clickCommand;
 public UICommand ClickCommand
 {
     get { return _clickCommand; }
 }
在视图模型构造函数中编写以下语句

 public YourViewModelConstructor()
 {
     _clickCommand = new UICommand(OnClick);
 }
下面是绑定到ClickCommand的方法

 private void OnClick(object parameter)
 {
     switch(parameter.ToString())
     {
         case "Button 1":
             IsButton1Active = true;
             IsButton2Active = false;
             break;

         case "Button 2":
             IsButton2Active = true;
             IsButton1Active = false;
             break;
     }
 }
下面是我的UICommand类的代码

 public class UICommand : ICommand
 {
    private readonly Action<object> _execute;
    private readonly Func<bool> _canExecute;

    public UICommand(Action<object> onExecuteMethod, Func<bool> onCanExecuteMethod = 
         null)
   {
     _execute = onExecuteMethod;
     _canExecute = onCanExecuteMethod;
   }

   public bool IsCanExecute { get; set; }

   #region ICommand Members

 public event EventHandler CanExecuteChanged
 {
     add { if (_canExecute != null) CommandManager.RequerySuggested += value; }
     remove { if (_canExecute != null) CommandManager.RequerySuggested -= value; }
 }

 public void Execute(object parameter)
 {
     _execute(parameter);
 }

 public bool CanExecute(object parameter)
 {
     IsCanExecute = (_canExecute == null || _canExecute());
     return IsCanExecute;
 }

 #endregion

 public void RaiseCanExecuteChanged()
 {
     CommandManager.InvalidateRequerySuggested();
 }
 }
我假设您知道如何为窗口设置datacontext

本示例向您介绍了如何通过创建在ViewModel中创建的一些属性来实现功能,并将视图中的命令绑定到ViewModel命令属性,并通过传递命令参数来调用click命令


实施解决方案后仍有任何疑问,请告知。

您好,我对您的说法有点困惑-我想在单击按钮时更改按钮的颜色,并在单击StackPanel中的另一个按钮时将其重置为原始颜色-您的意思是第一个按钮应恢复为其自身颜色,第二个按钮应恢复为,依此类推…?或者仅是第一个按钮重置为其自身颜色,并让其他按钮保持不变是如果您的问题是我的第二个陈述,那么您可以轻松地使用ViewModel中的bool属性执行此操作,然后创建一个数据触发器,并根据值true/false更改第一个按钮的颜色。因此,每次单击按钮时,都需要切换布尔属性值。有一种颜色表示按钮处于活动状态,另一种颜色表示按钮处于非活动状态。所有按钮最初均为非活动颜色。因此,如果单击第一个按钮,则其颜色应更改为活动,当单击另一个按钮时,第一个按钮的颜色将更改为非活动,第二个按钮的颜色将更改为活动颜色。
 public class UICommand : ICommand
 {
    private readonly Action<object> _execute;
    private readonly Func<bool> _canExecute;

    public UICommand(Action<object> onExecuteMethod, Func<bool> onCanExecuteMethod = 
         null)
   {
     _execute = onExecuteMethod;
     _canExecute = onCanExecuteMethod;
   }

   public bool IsCanExecute { get; set; }

   #region ICommand Members

 public event EventHandler CanExecuteChanged
 {
     add { if (_canExecute != null) CommandManager.RequerySuggested += value; }
     remove { if (_canExecute != null) CommandManager.RequerySuggested -= value; }
 }

 public void Execute(object parameter)
 {
     _execute(parameter);
 }

 public bool CanExecute(object parameter)
 {
     IsCanExecute = (_canExecute == null || _canExecute());
     return IsCanExecute;
 }

 #endregion

 public void RaiseCanExecuteChanged()
 {
     CommandManager.InvalidateRequerySuggested();
 }
 }