Доступ к StoryBoard из шаблона - PullRequest
1 голос
/ 15 июня 2011

Вот какой класс я получил:

<Style x:Key="BoutonMenu" TargetType="{x:Type Button}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Margin" Value="5,5,5,5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="BtnHover" AutoReverse="False" RepeatBehavior="Forever">
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="contentPresenter">
                            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="-1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:4" Value="1"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="BtnClick" AutoReverse="False">
                        <PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="border">
                            <EasingPointKeyFrame KeyTime="0:0:0.1" Value="0.5,0.5"/>
                            <EasingPointKeyFrame KeyTime="0:0:0.15" Value="0.5,0.5"/>
                            <EasingPointKeyFrame KeyTime="0:0:0.25" Value="0.5,0.5"/>
                            <EasingPointKeyFrame KeyTime="0:0:0.4" Value="0.5,0.5"/>
                            <EasingPointKeyFrame KeyTime="0:0:0.6" Value="0.5,0.5"/>
                            <EasingPointKeyFrame KeyTime="0:0:1" Value="0.5,0.5"/>
                        </PointAnimationUsingKeyFrames>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="border">
                            <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="-1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="-1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="-1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
                        </DoubleAnimationUsingKeyFrames>
                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
                            <EasingColorKeyFrame KeyTime="0:0:1" Value="#FF337641"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="BtnRevert">
                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
                            <EasingColorKeyFrame KeyTime="0" Value="#FF337641"/>
                            <EasingColorKeyFrame KeyTime="0:0:0.5" Value="Black"/>
                        </ColorAnimationUsingKeyFrames>
                        <PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="border">
                            <EasingPointKeyFrame KeyTime="0:0:0.5" Value="0.5,0.5"/>
                        </PointAnimationUsingKeyFrames>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="border">
                            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="-1"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </ControlTemplate.Resources>
                <Border x:Name="border" BorderBrush="#FF000000" Background="#FF000000" BorderThickness="0" CornerRadius="20" Opacity="1" >
                    <Border.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform/>
                            <SkewTransform/>
                            <RotateTransform/>
                            <TranslateTransform/>
                        </TransformGroup>
                    </Border.RenderTransform>
                    <Grid x:Name="grid">
                        <Border x:Name="mask" Background="White" CornerRadius="20"/>
                        <!-- Background Layer -->
                        <Grid x:Name="grid1">
                            <Grid.OpacityMask>
                                <VisualBrush Visual="{Binding ElementName=mask}"/>
                            </Grid.OpacityMask>
                            <Rectangle x:Name="rectangle" Fill="#FF000000" >
                                <Rectangle.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform/>
                                        <TranslateTransform/>
                                    </TransformGroup>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="RefractionLayer">
                                <Rectangle.Fill>
                                    <RadialGradientBrush GradientOrigin="0.496,1.052">
                                        <RadialGradientBrush.RelativeTransform>
                                            <TransformGroup>
                                                <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
                                                <TranslateTransform X="0.02" Y="0.3"/>
                                            </TransformGroup>
                                        </RadialGradientBrush.RelativeTransform>
                                        <GradientStop Offset="0.819" Color="#00000000"/>
                                        <GradientStop Color="#FF020000" Offset="0.187"/>
                                    </RadialGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>

                            <ContentPresenter x:Name="contentPresenter" Margin="0,2,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
                                <ContentPresenter.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform/>
                                        <SkewTransform/>
                                        <RotateTransform/>
                                        <TranslateTransform/>
                                    </TransformGroup>
                                </ContentPresenter.RenderTransform>
                            </ContentPresenter>

                        </Grid>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="ButtonBase.Click">
                        <StopStoryboard BeginStoryboardName="BtnHover_BeginStoryboard"/>
                        <StopStoryboard BeginStoryboardName="BtnClick_BeginStoryboard"/>
                        <BeginStoryboard x:Name="BtnClick_BeginStoryboard" Storyboard="{StaticResource BtnClick}"/>
                    </EventTrigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Trigger.ExitActions>
                            <RemoveStoryboard BeginStoryboardName="BtnHover_BeginStoryboard"/>
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard x:Name="BtnHover_BeginStoryboard" Storyboard="{StaticResource BtnHover}"/>
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True"/>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Opacity" Value="0.25"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Как видите, у меня есть 3 разных раскадровки, две из которых происходят по определенным триггерам. У меня есть третий (BtnRevert), который я хотел бы начать по требованию. Я не могу найти, как это сделать. Возможно ли это, если да, то как, а если нет, как я могу обойти это?

Редактировать: Итак, я попробовал это:

        Dim s As Storyboard = _oCurMenuBouton.Template.Resources("BtnRevert")
        s.Begin()

Кажется, что раскадровка верна, но теперь я понимаю:

No applicable name scope exists to resolve the name 'rectangle'.

Кажется, он не распознает, что раскадровка является собственностью моей кнопки или, по крайней мере, шаблона. Есть ли способ заставить его работать?

Получил это на работу! Вот ответ

        Dim s As Storyboard = _oCurMenuBouton.Template.Resources("BtnRevert")
        s.Begin(_oCurMenuBouton,_oCurMenuBouton,Template)

Спасибо

1 Ответ

2 голосов
/ 15 июня 2011

просто попробуйте это

  <Button Height="25"
            Margin="5"
            Style="{StaticResource BoutonMenu}" Click="Button_Click"></Button>

в коде за

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        var rButton = sender as Button;
        if (rButton != null)
        {
            Storyboard s = (Storyboard)rButton.Template.Resources["BtnRevert"];
        }  
    }
...