Silverlight 更改复选框的命中区域

Silverlight 更改复选框的命中区域,silverlight,checkbox,combobox,Silverlight,Checkbox,Combobox,我正在尝试创建一个多选组合框,除了选择之外,一切似乎都正常工作,我正在使用一个自定义模板,其中包括一个复选框用于选择,我忽略了所有标准组合框选择 当用户专门单击复选框或其文本时,选择行会起作用,但是如果用户单击可见的comboboxitem,则会关闭下拉列表,而不会单击复选框。我希望能够单击组合框行中的任意位置以选中该复选框 我在复选框上方放置了一个透明的矩形(调试时为粉红色),该复选框接受输入并设置选中的变量。矩形接收输入,但它仍将单击事件传递到组合框,结果选择组合框行并关闭下拉列表 数据模板

我正在尝试创建一个多选组合框,除了选择之外,一切似乎都正常工作,我正在使用一个自定义模板,其中包括一个复选框用于选择,我忽略了所有标准组合框选择

当用户专门单击复选框或其文本时,选择行会起作用,但是如果用户单击可见的comboboxitem,则会关闭下拉列表,而不会单击复选框。我希望能够单击组合框行中的任意位置以选中该复选框

我在复选框上方放置了一个透明的矩形(调试时为粉红色),该复选框接受输入并设置选中的变量。矩形接收输入,但它仍将单击事件传递到组合框,结果选择组合框行并关闭下拉列表

数据模板

<DataTemplate x:Key="CheckBoxTemplate">
    <Grid>
        <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="HotPink" IsHitTestVisible="True">
             <i:Interaction.Behaviors>
                 <behaviors:HitBoxBehaviour IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
             </i:Interaction.Behaviors>
         </Rectangle>
         <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding Name}" Tag="{Binding Id}" HorizontalAlignment="Stretch" Height="25" FontSize="14"
                              VerticalAlignment="Stretch"/>
    </Grid>
</DataTemplate>

行为

public class HitBoxBehaviour : Behavior<Rectangle>
{
    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }

    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("IsChecked", typeof(bool), typeof(HitBoxBehaviour),
        new PropertyMetadata(false, new PropertyChangedCallback(parameterChanged)));


    private static void parameterChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
    }

    void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        IsChecked = !IsChecked;
        e.Handled = true;
    }
}
公共类HitboxBehavior:行为
{
公共场所被检查
{
获取{return(bool)GetValue(IsCheckedProperty);}
set{SetValue(IsCheckedProperty,value);}
}
公共静态只读从属属性是检查属性=
DependencyProperty.Register(“IsChecked”)、typeof(bool)、typeof(HitboxBehavior),
新PropertyMetadata(false,新PropertyChangedCallback(parameterChanged));
私有静态void参数已更改(DependencyObject发送方、DependencyPropertyChangedEventArgs e)
{
}
受保护的覆盖无效附加()
{
base.onatached();
this.AssociatedObject.MouseLeftButtonDown+=新的MouseButtonEventHandler(AssociatedObject\u MouseLeftButtonDown);
}
void associated object_MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
IsChecked=!IsChecked;
e、 已处理=正确;
}
}
是否仍然可以扩展复选框的点击框而不将点击事件传递到组合框

这对我很有用:

XAML

<Border x:Name="CheckBorder" Width="100" Height="30" Background="Black" MouseLeftButtonDown="CheckBorder_MouseLeftButtonDown">
      <CheckBox x:Name="CheckBox"></CheckBox>
</Border>

如果重新设置复选框的模板并为其提供透明背景,则可以单击任意位置以切换其复选框。不需要“点击框”

<Style TargetType="CheckBox">
    <Setter Property="Background" Value="#FF448DCA"/>
    <Setter Property="Foreground" Value="#FF000000"/>
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalContentAlignment" Value="Top"/>
    <Setter Property="Padding" Value="4,1,0,0"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA3AEB9" Offset="0"/>
                <GradientStop Color="#FF8399A9" Offset="0.375"/>
                <GradientStop Color="#FF718597" Offset="0.375"/>
                <GradientStop Color="#FF617584" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CheckBox">
                <!-- Added Background here -->
                <Grid Background="Transparent">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="16"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

它与我的矩形解决方案完全相同,只是使用了边框。这并不能解决问题,如果我不清楚的话,我会编辑我最初的帖子。谢谢
<Style TargetType="CheckBox">
    <Setter Property="Background" Value="#FF448DCA"/>
    <Setter Property="Foreground" Value="#FF000000"/>
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalContentAlignment" Value="Top"/>
    <Setter Property="Padding" Value="4,1,0,0"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA3AEB9" Offset="0"/>
                <GradientStop Color="#FF8399A9" Offset="0.375"/>
                <GradientStop Color="#FF718597" Offset="0.375"/>
                <GradientStop Color="#FF617584" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CheckBox">
                <!-- Added Background here -->
                <Grid Background="Transparent">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="16"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>