【问题标题】:WPF: Button ControlTemplate + Spacebar = exception?WPF:按钮 ControlTemplate + 空格键 = 异常?
【发布时间】:2010-10-27 10:11:12
【问题描述】:

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

无效操作异常 “[Unknown]”属性未指向路径“(0).(1).[0].(2)”中的 DependencyObject。

代码如下:

    <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 可用。

我仍然对另一件事感到好奇 - 考虑到这种感觉就像是 hack(例如:添加/动画了第三个渐变停止,那么解决此问题的 最佳 方法是什么?那么当 IsPressed==True 时需要添加第三个 GradientStop)。

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

【问题讨论】:

    标签: wpf exception button controltemplate


    【解决方案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)。

    【讨论】:

    • 为了给予应得的荣誉,由于 Pwninstein 的回答,我尝试用类似的画笔换掉背景。其他方法可能有效,但这对我有用。
    【解决方案2】:

    看起来您的 IsPressed 触发器的 Setter 正在尝试将颜色值 (#FF92A2D3) 分配给边框的背景属性。但是,边框的背景属性包含线性渐变画笔,而不是纯色画笔。不过,这只是初步的看法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2016-06-15
        相关资源
        最近更新 更多