如何让一组切换button的行为像WPF中的单选button?

我有一组button应该像切换button,但也作为单选button,只有一个button可以select/按下在当前时间。 它也需要有一个没有select/按下button的状态。

该行为将有点像Photoshop工具栏,在任何时候select零或一个工具!

任何想法如何在WPF中实现?

最简单的方法是设置一个ListBox来为其ItemTemplate使用ToggleButtons

<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。

我认为这是最简单的方法。

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

请享用! – Pricksaw

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

它适合我,享受!

你可以在Click的ToggleButton上总是使用一个通用的事件,通过VisualTreeHelper的帮助,把groupcontrol(Grid,WrapPanel,…)中的所有的ToggleButton.IsChecked设置为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; } 

你可以把网格与单选button,并创buildbutton模板raduiobuttons。 不只是programmaticaly删除检查,如果你不想要button切换

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

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

然后编写代码对抗IsChecked属性来模拟单选button效果

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

嘿,我已经为此开发了一个解决scheme。 您可以覆盖单选button的控件模板并放置按下button。 我在这里有一个开放源代码库实施的解决scheme:

http://code.google.com/p/phoenix-control-library/

您可以获得开箱即用的工作解决scheme,或者查看其中的源代码。

请享用。

我为RibbonToggleButtons做了这个,但是对于常规的ToggleButton也是如此。

我把每个button的IsChecked绑定到一个“模式”枚举值从这里使用EnumToBooleanConverter 如何将RadioButtons绑定到一个枚举? (使用ConverterParameter指定这个button的枚举值,每个button应该有一个枚举值)

然后,为了防止取消选中已经检查过的button,请将其置于每个RibbonToggleButton的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; } } } 

帮助像朱利安和我这样的人(两分钟前…)。 你可以像这样从RadioButton派生。

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

那么,你可以使用像乌代基兰build议…

 <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。