Как анимировать ресурс в XAML? - PullRequest
4 голосов
/ 26 июня 2009

В документе XAML у меня есть кисть градиента в качестве ресурса и набор фигур, которые используют этот ресурс. Я хотел бы анимировать кисть, используя раскадровку, но я не знаю, как установить кисть в ресурсах как цель раскадровки. Простое использование его имени не работает, {StaticResource name} также не работает. Это вообще возможно?

Я бы предпочел решение только на XAML, но если это не сработает, я буду использовать кодовый код. Если это позволит мне оставить Storyboard.Target и Storyboard.TargetProperty без назначения.

РЕДАКТИРОВАТЬ: Я хотел бы анимировать градиент остановки кисти. Дело в том, что я могу легко анимировать его, когда он не является ресурсом, а применяется непосредственно к объекту. Я могу сделать это, нажав на Expression Blend. Я просто не знаю, как его анимировать, когда он является ресурсом (то есть что помещать вместо ?? в приведенном ниже коде (раскадровка была создана для прямоугольника))

code:
<UserControl.Resources>
    <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#7F7CE3FF" Offset="0"/>
        <GradientStop Color="#7F047695" Offset="1"/>
        <GradientStop Color="#FFFFFFFF" Offset="0.942"/>
    </LinearGradientBrush>
    <Storyboard x:Key="Glitter">
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="??" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Offset)">
            <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
            <SplineDoubleKeyFrame KeyTime="00:00:02.6000000" Value="0.529"/>
        </DoubleAnimationUsingKeyFrames>

    </Storyboard>
 ...

Ответы [ 3 ]

3 голосов
/ 26 июня 2009

Работает, когда вы анимируете свойство Background / Fill напрямую, используя имя объекта (например, Rectangle), которое вы хотите анимировать как Storyboard.TargetName:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Grid.Resources>
        <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#7F7CE3FF" Offset="0"/>
            <GradientStop Color="#7F047695" Offset="1"/>
            <GradientStop Color="#FFFFFFFF" Offset="0.942"/>
        </LinearGradientBrush>
    </Grid.Resources>

    <Border Name="border" 
            Background="{StaticResource Outline}"
            Width="200" Height="200" />
</Grid>

<Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
                                               Storyboard.TargetName="border" 
                                               Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[0].(GradientStop.Offset)">
                    <SplineDoubleKeyFrame KeyTime="00:00:0" Value="0"/>
                    <SplineDoubleKeyFrame KeyTime="00:00:1" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>

Редактировать

Исходя из кода, это вполне возможно:

XAML:

<Grid Name="grid">
    <Grid.Resources>
        <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#7F7CE3FF" Offset="0"/>
            <GradientStop Color="#7F047695" Offset="1"/>
            <GradientStop Color="#FFFFFFFF" Offset="0.942"/>
        </LinearGradientBrush>
    </Grid.Resources>

    <Border Background="{StaticResource Outline}"
            Width="100" Height="100" HorizontalAlignment="Left" />

    <Border Background="{StaticResource Outline}"
            Width="100" Height="100" HorizontalAlignment="Right" />
</Grid>

C # код позади:

        LinearGradientBrush b = grid.Resources["Outline"] as LinearGradientBrush;

        b.GradientStops[0].BeginAnimation(GradientStop.OffsetProperty, new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(1))));
2 голосов
/ 26 июня 2009

Вы не можете анимировать свойства типа Brush, вы можете анимировать только те типы, которые имеют соответствующий класс анимации, например DoubleAnimation, PointAnimation или ColorAnimation (обратите внимание, что последний анимирует свойства типа Color, а не Brush).

Однако некоторые кисти имеют свойства DependencyProperties типа double, которые можно анимировать, например, свойства StartPoint и EndPoint класса LinearGradientBrush-Class.

Если вы можете уточнить, что именно должна делать анимация, возможно, мы могли бы найти обходной путь.

Edit: Чтобы оживить кисть, она должна быть объявлена ​​в области действия вашего анимационного триггера, например, в Data- или ControlTemplate. Анимация ресурса с помощью его ключа не будет работать.

0 голосов
/ 26 июня 2009

Не уверен, что именно вы пытаетесь анимировать внутри кисти, но анимация ресурсов кисти может быть очень сложной. У меня нет времени, чтобы все напечатать, но вот небольшой «учебник» о том, как с этим справиться:

Анимация кистей с помощью ObjectAnimationUsingKeyFrames

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...