C# 如何禁用除已单击的切换按钮之外的所有切换按钮?

C# 如何禁用除已单击的切换按钮之外的所有切换按钮?,c#,wpf,C#,Wpf,我正在使用C#和WPF制作一个应用程序 我有8个切换按钮 当我单击其中一个按钮时,其他按钮应该被禁用,因此我不能单击它,除非有一个按钮被激活。 当我再次单击此按钮时,应启用其他按钮 Styles.xaml: MainWindow.xaml: 如何通过代码和XAML实现这一点? 我想在这个视频中这样做: 使用单击每个切换按钮的事件 一种方法是为所有的切换按钮指定名称,连接到它们的单击事件,然后手动取消选中代码隐藏中的其他按钮: XAML 代码隐藏 private void按钮1\u单击

我正在使用C#和WPF制作一个应用程序

我有8个切换按钮

当我单击其中一个按钮时,其他按钮应该被禁用,因此我不能单击它,除非有一个按钮被激活。 当我再次单击此按钮时,应启用其他按钮

Styles.xaml:


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" />