Изменение области попадания чекбокса - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь создать поле со множественным выбором, кажется, что все работает нормально, кроме выбора, я использую пользовательский шаблон, включая флажок для выбора, я игнорирую все стандартные варианты выбора со списком.

Выбор строк работает, когда пользователь щелкает конкретно по флажку или его тексту, однако, если пользователь нажимает видимый комбинированный элемент, он закрывает раскрывающийся список и не устанавливает флажок.Я хотел бы иметь возможность щелкнуть в любом месте строки со списком, чтобы установить флажок.

Я поставил прозрачный прямоугольник (ярко-розовый для отладки) над флажком, который вместо этого принимает ввод и устанавливаетпроверенная переменная.Прямоугольник получает входные данные, однако он также передает событие щелчка в поле со списком и в результате выбирает строку со списком и закрывает раскрывающийся список.

Шаблон данных

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

В любом случае можно ли расширить поле попадания флажка, не передавая событие щелчка вниз в поле со списком?

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Если вы измените шаблон CheckBox и создадите для него прозрачный фон, вы сможете щелкнуть в любом месте, чтобы установить его флажок. Нет «хитбокса» необходимо.

<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 голосов
/ 02 марта 2012

Это работает для меня:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...