2013-12-05 2 views
0

Я пытаюсь использовать относительное привязку и привязывать свойство Window.ActualHeight к DoubleAnimation.To свойству.Использовать относительное связывание для привязки prop Window.ActualHeight to DoubleAnimation.To prop

Относительная привязка не работает, но если я использую привязку с помощью ElementName, она работает.

НЕ РАБОТАЕТ:

<Window xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="Sample.Window" 
     x:Name="Shell" 
     Title="Sample" 
     Width = "525" 
     Height = "350"> 

    <Canvas Height="400"> 
     <Ellipse Canvas.Left="80" 
       Canvas.Top="0" 
       Width="30" 
       Height="30" 
       Fill="LimeGreen"> 
      <Ellipse.Triggers> 
       <EventTrigger RoutedEvent="Ellipse.Loaded"> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
              Duration="0:0:5" 
              RepeatBehavior="Forever" 
              AutoReverse="True" 
              To="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}, Path=ActualHeight}" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Ellipse.Triggers> 
     </Ellipse> 
    </Canvas> 
</Window> 

ЭТУ РАБОТУ:

<DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
             Duration="0:0:5" 
             RepeatBehavior="Forever" 
             AutoReverse="True" 
             To="{Binding ElementName=Shell, Path=ActualHeight}"/> 

Это можно использовать относительное связывание с Window.ActualHeight собственности?

Редакция:

Я снова протестирован на маршрутизируемом случае Ellipse.Loaded анимация не работает, но если я изменил маршрутизируемое событие анимации работы MouseEnter. Я опубликовал весь проект.

sample download

Спасибо

+0

Я предполагаю, что визуальное дерево не место '' под '' , так что переменная 'RelativeSource' связывания не находит его, когда он подходит визуальный дерева из ''. Это всего лишь предположение, но я его не тестировал :) – Rachel

ответ

1

Как ни странно, если какой-либо frameworkElement traverses Visual Tree till ancestral window, в этом случае DoubleAnimation too is able to find ancestral window, но если ни один элемент не имеет в виду родовое окно, DoubleAnimation не в состоянии пройти вверх по визуальному дереву.

В вашем примере в случае, если я просто перехожу к окну вне анимации, он работает. Проверьте этот образец (traverse tree using Tag property of canvas) -

<Canvas Height="400" 
     Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType=Window}}"> <-HERE 
    <Ellipse Canvas.Left="80" 
      Canvas.Top="0" 
      Width="30" 
      Height="30" 
      Fill="LimeGreen"> 
     <Ellipse.Triggers> 
     <EventTrigger RoutedEvent="Ellipse.Loaded"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
            Duration="0:0:5" 
            RepeatBehavior="Forever" 
            AutoReverse="True" 
            To="{Binding RelativeSource={RelativeSource 
               AncestorType={x:Type Window}, 
               Mode=FindAncestor}, 
               Path=ActualHeight}" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Ellipse.Triggers> 
    </Ellipse> 
</Canvas> 
+0

Извините за ошибку с Height и ActualHeight. Свойство Height окна установлено равным 350 (смотрите XAML). Относительная привязка не работает для ActualHeight также для высоты. – imodin

+0

Я попробовал ваш образец и его работу для меня, хотя. –

+0

Я тестировал снова на маршрутизированном событии Ellipse.Loaded анимация не работает, но если я изменил маршрутизируемое событие на анимационную работу MouseEnter. Я опубликовал весь проект. Вы запускаете триггер события на каком событии? – imodin

Смежные вопросы