Como obter um grupo de botões de alternância para atuar como botões de opção no WPF?

Eu tenho um grupo de botões que devem agir como botões de alternância, mas também como botões de opção, onde apenas um botão pode ser selecionado / pressionado em um momento atual. Também precisa ter um estado em que nenhum dos botões esteja selecionado / pressionado.

O comportamento será como a barra de ferramentas do Photoshop, onde zero ou uma das ferramentas são selecionadas a qualquer momento!

Alguma idéia de como isso pode ser implementado no WPF?

A maneira mais fácil é estilizar um ListBox para usar ToggleButtons para seu ItemTemplate

 

Em seguida, você pode usar a propriedade SelectionMode do ListBox para manipular SingleSelect vs MultiSelect.

Esta é a maneira mais fácil na minha opinião.

  

Apreciar! – Pricksaw

        

funciona para mim, divirta-se!

você sempre pode usar um evento genérico no Click do ToggleButton que define todos os ToggleButton.IsChecked em um groupcontrol (Grid, WrapPanel, …) como false com a ajuda do VisualTreeHelper; em seguida, verifique novamente o remetente. Ou algo assim.

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

você pode colocar grid com radiobuttons, e criar botão como template para raduiobuttons. que apenas programaticamente remover verificar se você não quer que os botões sejam alternados

Você também pode tentar System.Windows.Controls.Primitives.ToggleButton

  Test 

Em seguida, escrever código contra a propriedade IsChecked para imitar o efeito de IsChecked de opção

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

Ei, eu realmente desenvolvi uma solução para isso. Você pode replace o modelo de controle dos botões de opção e colocar os botões pressionados. Eu tenho uma solução implementada em uma biblioteca de código aberto aqui:

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

Você pode obter a solução de trabalho para uso imediato ou dar uma olhada no código-fonte lá.

Apreciar.

Eu fiz isso para RibbonToggleButtons, mas talvez seja o mesmo para os ToggleButtons comuns.

Eu limitei o IsChecked para cada botão a um valor de enum “mode” usando EnumToBooleanConverter daqui Como vincular RadioButtons a um enum? (Especifique o valor de enum para este botão usando o ConverterParameter. Você deve ter um valor de enum para cada botão)

Em seguida, para impedir a desmarcação de um botão que já está marcado, coloque isso no código para o evento Click de cada um dos RibbonToggleButtons:

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

Para ajudar pessoas como Julian e eu (dois minutos atrás …). Você pode derivar do RadioButton assim.

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

Então, você pode usá-lo como Uday Kiran sugeriu …

      

Esse método permite que apenas um ToggleButton seja Checked por vez e também permite que o UnChecking seja exibido.