Не могу установить стиль в триггере wpf - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу изменить стиль, когда кнопка переключения отмечена

<ToggleButton.Style>
                <Style TargetType="ToggleButton" BasedOn="{StaticResource ToggleButtonPrimary}">
                    <Style.Triggers>

                        <DataTrigger Binding="{Binding ElementName=ButtonNude, Path=IsChecked}" Value="True">
                            <Setter Property="Style" Value="{StaticResource ToggleButtonDanger}"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ToggleButton.Style>

, но мой код не работает и происходит сбой приложения

1 Ответ

0 голосов
/ 01 февраля 2019

Как предполагает @clemens, правильным способом было бы иметь шаблон и применять его в controlTemplate с TargetName

Существует еще один (может быть некрасивый) способ:

На виду:

    <StackPanel>
            <StackPanel.Resources>
                <local:Myconverter x:Key="MyConverter" />

                <Style TargetType="ToggleButton" x:Key="ToggleButtonPrimary">
                    <Setter Property="Background" Value="blue" />
                </Style>

                <Style TargetType="ToggleButton" x:Key="ToggleButtonDanger">
                    <Setter Property="Background" Value="Red" />
                </Style>
            </StackPanel.Resources>

            <CheckBox Margin="20" x:Name="chk" />

            <ToggleButton Width="100" Height="100" >
                <ToggleButton.Style>
                    <MultiBinding Converter="{StaticResource MyConverter}">
                        <MultiBinding.Bindings>
                            <Binding ElementName="chk" Path="IsChecked"/>                            
                            <Binding RelativeSource="{RelativeSource AncestorType=StackPanel}"/>                            
                        </MultiBinding.Bindings>
                    </MultiBinding>
                </ToggleButton.Style>            
            </ToggleButton>
        </StackPanel>

Конвертер:

    public class Myconverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if ((bool)values[0])
            {
                return (values[1] as FrameworkElement).Resources["ToggleButtonDanger"];
            }
            else
                return (values[1] as FrameworkElement).Resources["ToggleButtonPrimary"];            
        }


        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

    }

Надеюсь, что поможет.

...