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