2012-03-02 97 views
0

我试图做一个多选择组合框,除了选择,一切似乎都工作正常,我使用了一个包含选择复选框的自定义模板,我忽略了所有标准组合框选择。更改复选框的命中区域

选择行可以在用户特别点击复选框或其文本时起作用,但如果用户单击可见的组合框,它会关闭下拉框并且不会点击复选框。我希望能够点击组合框行中的任何位置来检查复选框。

我把一个透明的矩形(调试热粉红色)上面的复选框,取而代之的输入,并设置选中的变量。该矩形接收输入,但它仍然将单击事件传递到组合框,并因此选择组合框行并关闭下拉菜单。

数据模板

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

反正是有延长的复选框的命中框,而没有经过click事件到组合框?

回答

0

如果重新模板的复选框,并给它一个透明背景,你会能够点击任何地方来切换其复选框。没有“hitbox”必要。

<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> 
0

这个工作对我来说:

XAML

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

CS

private void CheckBorder_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    CheckBox.IsChecked = !CheckBox.IsChecked; 
} 
+0

它和我的矩形解决方案完全一样,只是使用边框。它不能解决问题,如果我不清楚,我会编辑我的初始文章。谢谢 – Midimatt 2012-03-02 17:32:20