如何让一组切换按钮像 WPF 中的单选按钮?

我有一组按钮,应该像开关按钮,但也作为单选按钮,其中只有一个按钮可以选择/按下当前时间。它还需要一个没有选择/按下任何按钮的状态。

这种行为将有点像 Photoshop 工具栏,其中零或一个工具被选择在任何时候!

知道如何在 WPF 中实现这一点吗?

85415 次浏览

你可以在网格中放置单选按钮,并为单选按钮创建类似按钮的模板。如果您不希望按钮被切换,那么可以通过编程方式删除检查

你也可以试试 System.Windows.Controls.Primitives.ToggleButton

 <ToggleButton Name="btnTest" VerticalAlignment="Top">Test</ToggleButton>

然后根据 IsChecked属性编写代码来模仿单选按钮效应

 private void btnTest_Checked(object sender, RoutedEventArgs e)
{
btn2.IsChecked = false;
btn3.IsChecked = false;
}

最简单的方法是对 ListBox 设置样式,使用 ToggleButtons 作为其 ItemTemplate

<Style TargetType="{x:Type ListBox}">
<Setter Property="ListBox.ItemTemplate">
<Setter.Value>
<DataTemplate>
<ToggleButton Content="{Binding}"
IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>

然后可以使用 ListBox 的 SelectionMode 属性处理 SingleSelect 与 MultiSelect。

在 VisualTreeHelper 的帮助下,你可以在 ToggleButton 的 Click 上使用一个通用事件来设置所有的 ToggleButton.IsChecked in a groupcontrol (Grid,WrapPanel,...)为 false; 然后重新检查发件人。 或者类似的东西。

private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
int childAmount = VisualTreeHelper.GetChildrenCount((sender as ToggleButton).Parent);


ToggleButton tb;
for (int i = 0; i < childAmount; i++)
{
tb = null;
tb = VisualTreeHelper.GetChild((sender as ToggleButton).Parent, i) as ToggleButton;


if (tb != null)
tb.IsChecked = false;
}


(sender as ToggleButton).IsChecked = true;
}
<RadioButton Content="Point" >
<RadioButton.Template>
<ControlTemplate>
<ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
</ControlTemplate>
</RadioButton.Template>
</RadioButton>

对我很有用,好好享受吧!

在我看来这是最简单的方法。

<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />

好好享受吧! 锯子

我这样做是为了 RibbonToggleButtons,但也许对于普通的 ToggleButtons 也是一样的。

我从这里使用 EnumToBoolean Converter 将每个按钮的 IsChecked 绑定到一个“ mode”枚举值(使用 ConverterParameter 为此按钮指定枚举值)。每个按钮应该有一个枚举值)

然后,为了防止取消选中一个已经选中的按钮,把它放在代码后面,用于每个 RibbonToggleButtons 的 Click 事件:

    private void PreventUncheckRibbonToggleButtonOnClick ( object sender, RoutedEventArgs e ) {


// Prevent unchecking a checked toggle button - so that one always remains checked
// Cancel the click if you hit an already-checked button


var button = (RibbonToggleButton)sender;
if( button.IsChecked != null ) { // Not sure why checked can be null but that's fine, ignore it
bool notChecked = ( ! (bool)button.IsChecked );
if( notChecked ){ // I guess this means the click would uncheck it
button.IsChecked = true;
}
}
}

为了帮助像朱利安和我这样的人(两分钟前...)。

class RadioToggleButton : RadioButton
{
protected override void OnToggle()
{
if (IsChecked == true) IsChecked = IsThreeState ? (bool?)null : (bool?)false;
else IsChecked = IsChecked.HasValue;
}
}

然后,你可以像 Uday Kiran 建议..。一样使用它

<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Sample"
Title="MainWindow" Height="600" Width="600">
<StackPanel>
<local:RadioToggleButton Content="Button" Style="{StaticResource {x:Type ToggleButton}}" />
</StackPanel>
</Window>

此方法一次只允许一个 ToggleButtonChecked,它还允许 UnChecking。

我从答案中选取了一部分,并添加了一些额外的代码。现在你可以有不同的切换按钮组,它们就像一个切换按钮:

<UserControl.Resources>
<Style x:Key="GroupToggleStyle" TargetType="ToggleButton">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding GroupName, RelativeSource={RelativeSource Self}}" Value="Group1"/>
<Condition Binding="{Binding BooleanProperty}" Value="true"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsChecked" Value="true"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>

还有不同组的单选按钮,看起来像开关按钮:

<Radio Button GroupName="Group1" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group1" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group2" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group3" Style="{StaticResource {x:Type ToggleButton}}">

一个简单的实现可能是在代码后面维护一个标志,例如:

ToggleButton _CurrentlyCheckedButton;

然后为所有上下文 ToggleButtons 分配一个 Checked 事件处理程序:

private void ToggleButton_Checked(object sender, RoutedEventArgs e)
{
if (_CurrentlyCheckedButton != null)
_CurrentlyCheckedButton.IsChecked = false;


_CurrentlyCheckedButton = (sender as ToggleButton);
}

并且,单个 Uncheck 事件处理程序:

private void ToggleButton_Unchecked(object sender, RoutedEventArgs e)
{
if (_CurrentlyCheckedButton == (sender as ToggleButton))
_CurrentlyCheckedButton = null;
}

这样你就可以得到你想要的“0或者1”选择。