WPF: запуск анимации элементов по имени из EventTrigger на динамически созданном элементе управления - PullRequest
3 голосов
/ 12 мая 2009

У меня есть Сетка внутри DataTemplate ItemsControl, поэтому будет много копий этой сетки. Я хочу щелкнуть мышью по сетке, чтобы вызвать раскадровку элемента вне DataTemplate. Например, я хотел бы анимировать свойства Transform именованного элемента, который существует в другом месте окна.

Допустим, мой DataTemplate выглядит примерно так:

    <DataTemplate x:Key="myDataTemplate">
        <Grid>
            <Grid.Triggers>
                <EventTrigger RoutedEvent="UIElement.MouseLeftButtonUp">
                    <BeginStoryboard>
                        <Storyboard Storyboard.TargetName="myRectangle">
                            <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.X)"
                                                 To="10" Duration="0:0:0.2" />
                            <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)"
                                                 To="10" Duration="0:0:0.2" />
                            <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
                                                 To="1" Duration="0:0:0.5" />
                            <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
                                                 BeginTime="0:0:0.5" To="1" Duration="0:0:0.5" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Grid.Triggers>
        </Grid>
    </DataTemplate>

и где-то в моем окне у меня есть прямоугольник, который выглядит так:

    <Rectangle x:Name="myRectangle" Height="400" Width="400">
        <Rectangle.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleX="0" ScaleY="0" />
                <TranslateTransform />
            </TransformGroup>
        </Rectangle.RenderTransform>
    </Rectangle>

Когда срабатывает событие MouseLeftButtonUp, я получаю следующее исключение:

Имя 'myRectangle' не найдено в области имен 'System.Windows.Controls.Grid'.

Есть ли способ сообщить раскадровке, где искать элемент с таким именем? Меня особенно интересует решение только для xaml, если оно существует.

1 Ответ

1 голос
/ 28 мая 2009

Можно найти элементы xaml в другой области имен (т.е. вне шаблона данных) с помощью режима FindAncestor привязки RelativeSource, если элемент xaml, с которым вы пытаетесь связать, является родительским элементом. Код привязки будет выглядеть так:

{Binding Path="myRectangle", RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Rectangle}}}

Привязки имен в раскадровках могут быть совершенно другим животным, но, возможно, вы можете использовать это.

...