Флажок check check event не запускается - PullRequest
0 голосов
/ 19 сентября 2018

Я застрял с этим.У меня есть кнопка с флажком внутри в WPF.

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

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

Поскольку флажок объявлен внутри стиля, чтобы получить ссылку на этот флажокЯ делаю из кода:

FrameworkElement templatedControl = this.deleteButton.Template.LoadContent() as FrameworkElement;
CheckBox templatedCheck = templatedControl.FindName("checkbox") as CheckBox;

И затем я реализую метод для события click, в коде:

public void DeleteClick(object sender, RoutedEventArgs e)
    {
        if (!(e.OriginalSource is CheckBox))
        {
                bool isChecked = templatedCheck.IsChecked.HasValue && templatedCheck.IsChecked.Value == true;
                Debug.Print(isChecked);    // This always returns false
        }
    }

Но я всегда получаю false значение.

Я также попытался добавить RoutedEventHandler в конструктор:

templatedCheck.Checked += new RoutedEventHandler(this.OnCheckChanged);
templatedCheck.Unchecked += new RoutedEventHandler(this.OnCheckChanged);

И затем определил обработчики.Но никакого эффекта, методы не вызываются, когда я проверяю флажок.

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

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

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

1 Ответ

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

Это должно работать:

private void SaveClick(object sender, RoutedEventArgs e)
{
    if (!(e.OriginalSource is CheckBox))
    {
        Button button = (Button)sender;
        CheckBox templatedCheck = button.Template.FindName("checkbox", button) as CheckBox;
        if (templatedCheck != null)
            Debug.Print(templatedCheck.IsChecked.ToString());
    }
}

Получает ссылку на CheckBox в шаблоне Button, который фактически нажат, и этот либо проверяется, либо не проверяется.

DataTemplate.LoadContent() создает еще один элемент Button на основе шаблона, который не является тем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...