我试图做一个多选择组合框,除了选择,一切似乎都工作正常,我使用了一个包含选择复选框的自定义模板,我忽略了所有标准组合框选择。更改复选框的命中区域
选择行可以在用户特别点击复选框或其文本时起作用,但如果用户单击可见的组合框,它会关闭下拉框并且不会点击复选框。我希望能够点击组合框行中的任何位置来检查复选框。
我把一个透明的矩形(调试热粉红色)上面的复选框,取而代之的输入,并设置选中的变量。该矩形接收输入,但它仍然将单击事件传递到组合框,并因此选择组合框行并关闭下拉菜单。
数据模板
<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事件到组合框?
它和我的矩形解决方案完全一样,只是使用边框。它不能解决问题,如果我不清楚,我会编辑我的初始文章。谢谢 – Midimatt 2012-03-02 17:32:20