c# wpf checkbox wpf-style

c# - Región de destino del mouse personalizado para CheckBox en WPF



wpf-style (2)

Establecí un estilo personalizado para mi casilla de verificación, que se ve así (estado no verificado):

Cuando la casilla de verificación está "marcada", debería verse así:

Lo que quiero que suceda es que el usuario solo debería poder alternar haciendo clic en la marca de verificación en la esquina superior derecha. En este momento, la casilla de verificación se alternará en cualquier lugar donde el usuario haga clic dentro del cuadro y no dentro del expansor.

¿Hay alguna manera de configurar la región de clic del mouse para alternar la casilla de verificación solo alrededor de la marca de verificación en la esquina superior derecha?

Aquí está mi código tal como está:

<SolidColorBrush x:Key="SelectedCheckboxColor" Color="Green"/> <SolidColorBrush x:Key="UnselectedCheckboxColor" Color="Gray"/> <Style x:Key="SelectBoxCheckBoxStyle" TargetType="{x:Type CheckBox}"> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type CheckBox}"> <Border x:Name="border" BorderThickness="2" BorderBrush="#FF666666"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <ContentPresenter Grid.Column="0" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> <Image x:Name="image" Width="24" Height="24" Grid.Column="1" VerticalAlignment="Top" Source="Resources/checkbox-dogear-unchecked.png"/> </Grid> <!--<BulletDecorator Background="Transparent" SnapsToDevicePixels="true"> <BulletDecorator.Bullet> <Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" IsChecked="{TemplateBinding IsChecked}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"/> </BulletDecorator.Bullet> </BulletDecorator>--> </Border> <ControlTemplate.Triggers> <Trigger Property="HasContent" Value="true"> <Setter Property="Padding" Value="4,0,0,0"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Source" TargetName="image" Value="Resources/checkbox-dogear-checked.png"/> <Setter Property="BorderBrush" TargetName="border" Value="#FF00D212"/> </Trigger> <Trigger Property="IsMouseCaptureWithin" Value="True"> <Setter Property="BorderBrush" TargetName="border" Value="#FFA200FF"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>


quizás puede configurar un oyente on_click para la casilla de verificación y luego verificar las posiciones del mouse y solo cambiar el estado de la casilla si el mouse está dentro de los límites relativos correctos.


Creo que la respuesta de Rachel es la correcta, y como no es algo que haya intentado antes, pensé que tendría una oportunidad y que haría un intento rápido (bienvenida a la crítica).

No tenía las imágenes que estaba usando, así que utilicé un Polygon y un Path para simular el tickbox en su lugar, así que el estilo se convirtió en esto:

<SolidColorBrush x:Key="SelectedCheckboxColor" Color="#FF00D212"/> <SolidColorBrush x:Key="UnselectedCheckboxColor" Color="Gray"/> <Style TargetType="{x:Type CheckBox}"> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type CheckBox}"> <Border x:Name="border" BorderThickness="2" BorderBrush="{StaticResource ResourceKey=UnselectedCheckboxColor}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <ContentPresenter Grid.Column="0" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> <!-- Tickbox Mockup --> <Polygon x:Name="checkPoly" Points="0,0 24,24 24,0 0,0" Stroke="Purple" StrokeThickness="0" Width="24" Height="24" VerticalAlignment="Top" HorizontalAlignment="Right" Fill="{StaticResource ResourceKey=UnselectedCheckboxColor}" /> <Path Stroke="White" Data="M 6,6 L 9, 9 L 16,2" StrokeThickness="2" Margin="0, 1, 1, 0" VerticalAlignment="Top" HorizontalAlignment="Right" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="HasContent" Value="true"> <Setter Property="Padding" Value="4,0,0,0"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Fill" TargetName="checkPoly" Value="{StaticResource ResourceKey=SelectedCheckboxColor}"/> <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource ResourceKey=SelectedCheckboxColor}" /> </Trigger> <Trigger Property="IsMouseCaptureWithin" Value="True"> <Setter Property="BorderBrush" TargetName="border" Value="#FFA200FF"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>

Que luego se alojó, junto con un Expander (con un poco de contenido de prueba), dentro de un ContentControl :

<ContentControl Width="100" Height="100"> <Grid> <!-- Make sure the Checkbox is the foremost element --> <CheckBox Grid.ZIndex="99" /> <Expander Header="Test" > <StackPanel> <TextBlock Text="Test" /> <TextBlock Text="Test" /> <TextBlock Text="Test" /> </StackPanel> </Expander> </Grid> </ContentControl>

Que se ve así:

Su millaje puede variar dependiendo de dónde pretenda usar el Control . Una cosa a tener en cuenta, la casilla de verificación seguirá activada si hace clic en el borde; si eso es un problema, puede quitar el ancho del borde de la casilla de verificación, pegarlo en ContentControl y usar un poco de encuadernación para enganchar el CheckBox .