redondeados - ¿Cómo hacer que un grupo de botones de alternar actúen como botones de radio en WPF?
estilos datagrid wpf (9)
Esta es la forma más fácil en mi opinión.
<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />
¡Disfrutar! - Pricksaw
Tengo un grupo de botones que deberían actuar como botones de alternar, pero también como botones de radio donde solo se puede seleccionar / presionar un botón en el momento actual. También necesita tener un estado donde ninguno de los botones esté seleccionado / presionado.
El comportamiento será similar a la barra de herramientas de Photoshop, donde cero o una de las herramientas se seleccionan en cualquier momento.
¿Alguna idea de cómo esto puede implementarse en WPF?
Hice esto para RibbonToggleButtons, pero tal vez sea lo mismo para ToggleButtons regulares.
Encuaderné el IsChecked para cada botón en un valor de enum "mode" usando EnumToBooleanConverter desde aquí ¿Cómo vincular RadioButtons a una enumeración? (Especifique el valor enum para este botón usando el parámetro Convertidor. Debe tener un valor enum para cada botón)
Luego, para evitar que se desactive un botón que ya está marcado, coloque esto en su código para el evento Click para cada uno de los 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;
}
}
}
La forma más fácil es diseñar un ListBox para usar ToggleButtons para su 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>
Luego puede usar la propiedad SelectionMode de ListBox para manejar SingleSelect versus MultiSelect.
Oye, en realidad he desarrollado una solución para esto. Puede anular la plantilla de control de los botones de opción y colocar los botones de presión. Tengo una solución implementada en una biblioteca de código abierto aquí:
http://code.google.com/p/phoenix-control-library/
Puede obtener la solución de trabajo para su uso inmediato O ver el código fuente allí.
Disfrutar.
Para ayudar a personas como Julian y a mí (hace dos minutos ...). Puede derivar de RadioButton
esta manera.
class RadioToggleButton : RadioButton
{
protected override void OnToggle()
{
if (IsChecked == true) IsChecked = IsThreeState ? (bool?)null : (bool?)false;
else IsChecked = IsChecked.HasValue;
}
}
Entonces, puedes usarlo como share Uday Kiran share
<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>
Este método permite ToggleButton
solo un ToggleButton
a la vez, y también permite Desmontar.
También puedes probar System.Windows.Controls.Primitives.ToggleButton
<ToggleButton Name="btnTest" VerticalAlignment="Top">Test</ToggleButton>
Luego, escriba el código contra la propiedad IsChecked para imitar el efecto del IsChecked
de radio
private void btnTest_Checked(object sender, RoutedEventArgs e)
{
btn2.IsChecked = false;
btn3.IsChecked = false;
}
puede poner la cuadrícula con botones de radio en ella, y crear un botón como plantilla para botones raduio. que simplemente eliminar el control programáticamente si no desea que los botones se activen
siempre puede usar un evento genérico en el clic del botón Toggle que establece todos los ToggleButton.IsChecked en un control de grupo (Grid, WrapPanel, ...) en falso con la ayuda de VisualTreeHelper; luego vuelva a verificar el remitente. O algo parecido a eso.
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>
me funciona, ¡disfrútalo!