无法在触发器wpf中设置样式

时间:2019-02-01 09:09:14

标签: c# wpf triggers styles

我想在选中切换按钮时更改样式

<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 :(得分:1)

如@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();
        }

    }

希望有帮助。