WPF.Запретить флажок внутри кнопки от срабатывания события клика - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть кнопка с флажком внутри в WPF.Я хочу иметь возможность установить флажок , не вызывая событие нажатия кнопки кнопки.

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

enter image description here

Есть ли способ предотвратить это?

Это мой код:

Стиль для флажка:

<Style x:Key="FilledCheckBox" TargetType="{x:Type CheckBox}">
    <Setter Property="Foreground" Value="Gray"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}"> 
                <BulletDecorator Background="Transparent">
                    <BulletDecorator.Bullet>
                        <Border x:Name="Border"
                                Width="15"
                                Height="15"
                                CornerRadius="1"
                                BorderThickness="1">
                            <Border.BorderBrush>
                                <SolidColorBrush Color="Gray"/>
                            </Border.BorderBrush>
                            <Border.Background>
                                <SolidColorBrush Color="White"/>
                            </Border.Background>
                        </Border>
                    </BulletDecorator.Bullet>
                    <ContentPresenter Margin="5,0,0,0"
                                      VerticalAlignment="Top"
                                      HorizontalAlignment="Left"
                                      RecognizesAccessKey="True" />
                </BulletDecorator>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Background" TargetName="Border" Value="Green"/>
                        <Setter Property="BorderBrush" TargetName="Border" Value="Green"/>
                        <Setter Property="Foreground" Value="Green"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Стиль для кнопки (с флажком внутри):

<Style x:Key="RoundCornerButtonWithCheck" TargetType="{x:Type Button}">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Width" Value="120"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Button.Effect">
            <Setter.Value>
                <DropShadowEffect Color="Black" Direction="280" ShadowDepth="2" BlurRadius="5" Opacity="0.2" />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="grid">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Border x:Name="border" CornerRadius="15" BorderBrush="Black" BorderThickness="0"  Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              TextElement.FontWeight="SemiBold">
                            </ContentPresenter>
                        </Border>

                        <CheckBox x:Name="checkbox" Grid.Column="0" VerticalAlignment="Center" Margin="20,0,0,0" Style="{StaticResource FilledCheckBox}"></CheckBox>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <SolidColorBrush Color="Gold" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="border" Value="#FF33962B"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Opacity" TargetName="grid" Value="0.25"/>
                        </Trigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Кнопка в шаблоне:

<Button Name="deleteButton" Style="{StaticResource RoundCornerButtonWithCheck}" Content="{Binding Source={x:Static localization:Resources.Delete}, Converter={StaticResource CharacterCasingConverter}}" VerticalAlignment="Center" HorizontalAlignment="Left" Background="Red" Foreground="White" Margin="80,0,80,30" Click="DeleteClick"></Button>

1 Ответ

0 голосов
/ 19 сентября 2018

Есть ли способ предотвратить это?

Вы не можете реально запретить встроенному элементу управления Button обрабатывать щелчок, не отменяя событие PreviewMouseLeftButtonDown, ноВы можете реализовать обработчик событий, чтобы игнорировать щелчки на CheckBox:

private void SaveClick(object sender, RoutedEventArgs e)
{
    if (!(e.OriginalSource is CheckBox))
    {
        //handle click outside the CheckBox...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...