WPF: Botão ControlTemplate + Barra de espaço = exceção?

votos
1

Eu tenho jogado juntos um modelo no Expression Blend para um botão, e ele funciona bem - até que guia I até ele e pressione a barra de espaço. Estou tendo o erro a seguir:

InvalidOperationException '[Desconhecido]' propriedade não aponta para um DependencyObject no caminho '(0). (1). [0]. (2)'.

O código é a seguinte:

    <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>

Esta parece ser tanto o MouseOverStoryboard ou UnMouseOverStoryboard estão sendo disparados (O caminho mencionado no erro parece coincidir com a TargetProperty). Eu não sei por que tanto iria disparar ao pressionar a barra de espaço embora ... Alguma sugestão?

EDIT: Graças a Ryan Versaw, eu tentei o seguinte, que agora impede a barra de espaço-clique de lançar a exceção:

            <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>

Agora o tipo de escova permanece consistente (LinearGradientBrush), e há sempre GradientStop 0 disponível.

Eu ainda estou curioso sobre uma outra coisa - o que é a melhor maneira de ir a este respeito, considerando que este sorta se sente como um hack (ex: a terceira parada de gradiente é adicionado / animado, em seguida, um terceiro GradientStop precisa ser adicionado quando IsPressed == True).

Obrigado pelas sugestões! Esperemos que isto irá ajudar alguém, também.

Publicado 19/05/2009 em 19:18
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Eu não tenho certeza do que a solução ideal seria, mas eu encontrei um que funciona.

Criar um LinearGradientBrushem seus recursos:

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

Mude o seu IsPressedgatilho para o seguinte (apenas as Valuealterações):

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

Isso deve trocar o plano de fundo inteiro para um novo (que também é um LinearGradientBrush).

Respondeu 19/05/2009 em 20:00
fonte usuário

votos
1

Parece que Setter do seu IsPressed gatilho está tentando atribuir um valor de cor (# FF92A2D3) para a propriedade do fundo de sua fronteira. No entanto, a propriedade do fundo de sua fronteira contém um Gradiente escova Linear, não um pincel de cor sólida. Isso é apenas um primeiro parecer vista, no entanto.

Respondeu 19/05/2009 em 19:23
fonte usuário

votos
1

Se você pressionar a barra de espaço é como clicando no botão.
Você deve olhar para o IsPressedgatilho

Respondeu 19/05/2009 em 19:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more