2012-03-02 95 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