C# WPF中复选框的自定义鼠标点击区域
我已为复选框设置了自定义样式,如下所示(未选中状态): 当复选框处于“选中”状态时,应如下所示: 我希望用户只能通过单击右上角的复选标记来切换它。现在,复选框将切换用户单击的位于框内而不是扩展器内的任何位置 是否有一种方法可以将鼠标单击区域设置为仅围绕右上角的复选标记切换复选框 以下是我的代码:C# WPF中复选框的自定义鼠标点击区域,c#,wpf,checkbox,wpf-style,C#,Wpf,Checkbox,Wpf Style,我已为复选框设置了自定义样式,如下所示(未选中状态): 当复选框处于“选中”状态时,应如下所示: 我希望用户只能通过单击右上角的复选标记来切换它。现在,复选框将切换用户单击的位于框内而不是扩展器内的任何位置 是否有一种方法可以将鼠标单击区域设置为仅围绕右上角的复选标记切换复选框 以下是我的代码: <SolidColorBrush x:Key="SelectedCheckboxColor" Color="Green"/> <SolidColorBrush x:Key="Uns
<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>
也许你可以为复选框设置一个点击监听器,然后检查鼠标位置,只有当鼠标在正确的相对范围内时才更改复选框状态?我认为Rachel的答案是正确的,因为我以前没有尝试过这种方法,我想我会有一个裂缝,并迅速尝试(欢迎批评)
我没有您使用的图像,因此我使用了一个多边形
和一个路径
来模拟勾选框-因此样式变为:
<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>
看起来是这样的:
您的里程数可能会有所不同,具体取决于您打算在哪里使用
控件。需要注意的是,如果单击边框,该复选框仍将切换-如果出现问题,可以从复选框中删除边框宽度,将其粘贴在内容控件上,使用一些绑定来连接复选框中的边框
笔刷颜色
,我开始想,可能尝试在圆孔中安装方形销钉是个坏主意。我可能需要将其转换为自定义控件。不过,就这一个功能而言,这有点傻。我只是将复选框样式设置为三角形位,并将控件的其余部分设置为类似ContentControl
的其他内容。实际上,我确实用多边形绘制了复选标记区域,因为我希望能够更轻松地更改颜色(微调等)。为了得到一个原型供审查,我最终制作了一个模拟我想要的行为的UserControl
,其中还包括仅当鼠标在上面时才显示自己。但是,我确实希望最终将其转换为复选框,以利用其内置的可访问性功能。
<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>