WPF:Button ControlTemplate + Spacebar = exception?

时间:2009-05-19 18:18:16

标签: wpf exception button controltemplate

我已经在Expression Blend中为一个按钮拼了一个模板,它可以正常工作 - 直到我选中它并按空格键。我收到以下错误:

出现InvalidOperationException '[Unknown]'属性不指向路径'(0)中的DependencyObject。(1)。[0]。(2)'。

代码如下:

    <ControlTemplate x:Key="EmailButton" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
            <Storyboard x:Key="MouseOverStoryboard">
                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                    <SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FF55679E"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="UnMouseOverStoryboard">
                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                    <SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FF92A2D3"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </ControlTemplate.Resources>
        <Border x:Name="border" BorderBrush="#FF000000" BorderThickness="2,2,2,2" CornerRadius="4,4,4,4">
            <Border.Background>
                <LinearGradientBrush EndPoint="0.47,-0.01" StartPoint="0.47,0.808">
                    <GradientStop Color="#FF92A2D3" Offset="0"/>
                    <GradientStop Color="#FFFFFFFF" Offset="1"/>
                </LinearGradientBrush>
            </Border.Background>
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Background" TargetName="border" Value="#FF92A2D3"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard x:Name="MouseOverStoryboard_BeginStoryboard" Storyboard="{StaticResource MouseOverStoryboard}"/>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard x:Name="UnMouseOverStoryboard_BeginStoryboard" Storyboard="{StaticResource UnMouseOverStoryboard}"/>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

似乎要么触发MouseOverStoryboard或UnMouseOverStoryboard(错误中提到的路径似乎与TargetProperty匹配)。我不确定为什么要按空格键时会发射...有什么建议吗?

编辑: 感谢Ryan Versaw,我尝试了以下方法,现在可以防止空格键点击抛出异常:

            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Background" TargetName="border">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF92A2D3" Offset="0"/>
                            <GradientStop Color="#FF92A2D3" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>

现在画笔类型保持一致(LinearGradientBrush),并且总有第0个GradientStop可用。

我仍然对另一件事感到好奇 - 考虑到这种感觉就像是黑客一样(最佳方式是什么感觉(例如:第三个渐变停止被添加/动画,然后在IsPressed == True时需要添加第三个GradientStop。

感谢您的建议!希望这也会帮助其他人。

3 个答案:

答案 0 :(得分:1)

如果按空格键就像点击按钮一样 您应该查看IsPressed触发器

答案 1 :(得分:1)

看起来你的IsPressed Trigger的Setter试图将颜色值(#FF92A2D3)分配给边框的Background属性。但是,边框的背景属性包含线性渐变画笔,而不是纯色画笔。不过,这只是第一眼看到的意见。

答案 2 :(得分:1)

我不确定最佳解决方案是什么,但我找到了一个有效的解决方案。

在资源中创建LinearGradientBrush

<LinearGradientBrush x:Key="solidBrush">
    <GradientStop Color="#FF92A2D3"/>
</LinearGradientBrush>

IsPressed触发器更改为以下内容(仅Value更改):

<Trigger Property="IsPressed" Value="True">
    <Setter Property="Background" TargetName="border" Value="{StaticResource solidBrush}"/>
</Trigger>

这应该换掉你的整个背景换一个新的背景(也是LinearGradientBrush)。