2

ボタンのスタイルをオーバーライドしようとしています。実際に私は何十回もそれをやったが、今私はこれに出くわした:

例外と InnerException: {"プロパティをトリガーで null にすることはできません。"}

私のコード:

<Style x:Key="ArrowRightStyle" TargetType="{x:Type Button}">
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
    <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid Height="{Binding ElementName=imgBackground, Path=ActualHeight, Mode=OneWay}" 
                      Width="{Binding ElementName=imgBackground, Path=ActualWidth, Mode=OneWay}">
                    <Image x:Name="imgBackground" Source="{StaticResource RightArrowImageNormal}" Stretch="None"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource RightArrowImageDisabled}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource RightArrowImageIsPressed}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>

そしてそれは動作します:

    <Style x:Key="ArrowRightStyle" TargetType="{x:Type Button}">
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
    <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid Height="{Binding ElementName=imgBackground, Path=ActualHeight, Mode=OneWay}" 
                      Width="{Binding ElementName=imgBackground, Path=ActualWidth, Mode=OneWay}">
                    <Image x:Name="imgBackground" Source="{StaticResource RightArrowImageNormal}" Stretch="None"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource RightArrowImageDisabled}"/>
                    </Trigger>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsPressed}" Value="True">
                        <Setter TargetName="imgBackground"
                                Property="Source" Value="{StaticResource RightArrowImageIsPressed}"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

どうして????

4

1 に答える 1

2

ざっと見てみると、 IsPressed プロパティが見つからないと思います

「ボタン」を追加。するべきです。

....
  <Trigger Property="Button.IsPressed" Value="True">
     <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource....

または、テンプレートがボタンをターゲットにしていることを確認してください (スタイルで指定したことは知っていますが、それだけでは十分ではありません。テンプレートは typeof(Control) を想定し、コントロールには IsPressed がありません。

...
<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
            ....the rest of your code

と思います

{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsPressed}"

実行時に相対ソースのタイプを「ボタン」として解決するため、IsPressed を見つけることができます...

于 2012-05-03T21:34:26.393 に答える