C# 如何禁用除已单击的切换按钮之外的所有切换按钮?
我正在使用C#和WPF制作一个应用程序 我有8个切换按钮 当我单击其中一个按钮时,其他按钮应该被禁用,因此我不能单击它,除非有一个按钮被激活。 当我再次单击此按钮时,应启用其他按钮 Styles.xaml:C# 如何禁用除已单击的切换按钮之外的所有切换按钮?,c#,wpf,C#,Wpf,我正在使用C#和WPF制作一个应用程序 我有8个切换按钮 当我单击其中一个按钮时,其他按钮应该被禁用,因此我不能单击它,除非有一个按钮被激活。 当我再次单击此按钮时,应启用其他按钮 Styles.xaml: MainWindow.xaml: 如何通过代码和XAML实现这一点? 我想在这个视频中这样做: 使用单击每个切换按钮的事件 一种方法是为所有的切换按钮指定名称,连接到它们的单击事件,然后手动取消选中代码隐藏中的其他按钮: XAML 代码隐藏 private void按钮1\u单击
MainWindow.xaml:
如何通过代码和XAML实现这一点?
我想在这个视频中这样做:
使用
单击每个切换按钮的事件
一种方法是为所有的切换按钮指定名称,连接到它们的单击事件,然后手动取消选中代码隐藏中的其他按钮:
XAML
代码隐藏
private void按钮1\u单击(对象发送者,路由目标){
if(button1.IsChecked==true){
按钮2.IsChecked=false;
按钮3.IsChecked=false;
}
}
私有无效按钮2\u单击(对象发送者,路由目标){
如果(按钮2.IsChecked==true){
按钮1.IsChecked=false;
按钮3.IsChecked=false;
}
}
私有无效按钮3\u单击(对象发送者,路由目标){
if(button3.IsChecked==true){
按钮1.IsChecked=false;
按钮2.IsChecked=false;
}
}
这种方法繁琐、容易出错、需要代码隐藏且不具有很强的可扩展性
绑定i检查属性到bool
集合,一次一个true
。
另一种方法(仍然使用代码隐藏)是定义布尔值的集合并绑定每个切换按钮。在集合中的bool
之一上选中,并确保集合一次最多只包含一个true
:
代码隐藏
公共部分类主窗口:窗口{
公共主窗口(){
初始化组件();
ObservableCollection状态=新的ObservableCollection{false,false,false};
states.CollectionChanged+=states\u CollectionChanged;
数据上下文=状态;
}
私有无效状态\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e){
var collection=发送方作为可观察集合;
if(e.Action==NotifyCollectionChangedAction.Replace){
if((bool)e.NewItems[0]){
for(int i=0;i
同样,这使用代码隐藏而不是视图模型,但至少更容易添加行。使用单击每个切换按钮的事件
一种方法是为所有的切换按钮指定名称,连接到它们的单击事件,然后手动取消选中代码隐藏中的其他按钮:
XAML
代码隐藏
private void按钮1\u单击(对象发送者,路由目标){
if(button1.IsChecked==true){
按钮2.IsChecked=false;
按钮3.IsChecked=false;
}
}
私有无效按钮2\u单击(对象发送者,路由目标){
如果(按钮2.IsChecked==true){
按钮1.IsChecked=false;
按钮3.IsChecked=false;
}
}
私有无效按钮3\u单击(对象发送者,路由目标){
if(button3.IsChecked==true){
按钮1.IsChecked=false;
按钮2.IsChecked=false;
}
}
这种方法繁琐、容易出错、需要代码隐藏且不具有很强的可扩展性
绑定i检查属性到bool
集合,一次一个true
。
另一种方法(仍然使用代码隐藏)是定义布尔值的集合并绑定每个切换按钮。在集合中的bool
之一上选中,并确保集合一次最多只包含一个true
:
代码隐藏
公共部分类主窗口:窗口{
公共主窗口(){
初始化组件();
ObservableCollection状态=新的ObservableCollection{false,false,false};
states.CollectionChanged+=states\u CollectionChanged;
数据上下文=状态;
}
私有无效状态\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e){
var collection=发送方作为可观察集合;
if(e.Action==NotifyCollectionChangedAction.Replace){
if((bool)e.NewItems[0]){
for(int i=0;i
同样,这使用了代码隐藏,而不是视图模型,但至少添加行更容易。谢谢大家的评论,伙计们,我找到了另一个解决方案
MainWindow.XAML:
Styles.xaml:
<!--Toggle Button-->
<Style x:Key="ToggleButton" TargetType="{x:Type ToggleButton}">
<Setter Property="Background" Value="#535353"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="MinHeight" Value="30"/>
<Setter Property="Grid.Column" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Background="{TemplateBinding Background}"
BorderThickness="0">
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ToggleButton x:Name="CategoryToggle1"
Grid.Row="1"
Style="{StaticResource ToggleButton}"
Checked="ShowOptions"
Unchecked="HideOptions" />
<RadioButton x:Name="CategoryToggle1"
Grid.Row="1"
Grid.Column="1"
Style="{StaticResource RadioButton}"
GroupName="ToggleButtonsGroup"
Checked="OpenOptions"
Unchecked="HideOptions"/>
<!--Radio Button-->
<Style TargetType="RadioButton"
x:Key="RadioButton"
BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--Toggle Button-->
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="Background" Value="#535353" />
<Setter Property="MinHeight" Value="30" />
<Setter Property="Grid.Column" Value="1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Background="{TemplateBinding Background}"
BorderThickness="0">
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" Value="0.5" />
</Trigger>
<Trigger Property="IsEnabled" Value="true">
<Setter Property="Opacity" Value="1" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
private void OpenOptions(object sender, RoutedEventArgs e){
RadioButton radioButton = sender as RadioButton;
radioButton.IsChecked = true;
//Disable all option buttons except one that active
MyGrid.Children.OfType<RadioButton>().Where(rb => rb != radioButton &&
rb.GroupName == radioButton.GroupName).ToList().ForEach(rb => rb.IsEnabled = false);
}
private void HideOptions(object sender, RoutedEventArgs e)
{
RadioButton radioButton = sender as RadioButton;
MyGrid.Children.OfType<RadioButton>().Where(rb => rb.GroupName ==
radioButton.GroupName).ToList().ForEach(rb => rb.IsEnabled = true);
}
<Style x:Key='RadioToggle' TargetType='RadioButton'
BasedOn='{StaticResource {x:Type ToggleButton}}' />
<RadioButton Content='RadioToggle1' IsChecked='True'
Style='{StaticResource RadioToggle}'
GroupName="RadioToggleGroup" />
<RadioButton Content='RadioToggle2'
Style='{StaticResource RadioToggle}'
GroupName="RadioToggleGroup" />
<RadioButton Content='RadioToggle3'
Style='{StaticResource RadioToggle}'
GroupName="RadioToggleGroup" />