2015-02-10 1 views
2

У меня есть анимация, которая перемещает границу (с использованием преобразования перевода рендера) до ее ширины. Эта анимация должна применяться к нескольким границам, и эти границы будут различаться по ширине. Поэтому я привязал свойство Value к ключевому кадру анимации до ActualWidth границы, поэтому оно выйдет из игры.Использование DataTrigger для запуска анимации, для которой требуется динамическое значение

Попытки запустить этот код даст исключение с сообщением: Cannot freeze this Storyboard timeline tree for use across threads.

Жесткое кодирование значения для Value свойства ключевых исправлений каркасных этой проблемой, но потом анимации либо заходит слишком далеко, или нет достаточно далеко.

Вот пример кода, который показывает, что я пытаюсь выполнить.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="WpfApplication1.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid > 
    <Button Content="Show Menu" HorizontalAlignment="Left" Margin="270,30,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Click="Button_Click"/> 

    <Border x:Name="border" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="100" Margin="260,108,0,0" VerticalAlignment="Top" Width="100" RenderTransformOrigin="0.5,0.5"> 
    <Border.Style> 
     <Style> 
      <Style.Resources> 
       <Storyboard x:Key="SlideOut"> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border"> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="{Binding ActualWidth, ElementName=border}"/> 
       </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
       <Storyboard x:Key="SlideIn"> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border"> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/> 
       </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </Style.Resources> 
     <Style.Triggers> 
       <DataTrigger Binding="{Binding IsMenuOpen}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource SlideOut}"/> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource SlideIn}"/> 
       </DataTrigger.ExitActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
     <Border.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Border.RenderTransform> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="Black" Offset="0"/> 
       <GradientStop Color="White" Offset="1"/> 
      </LinearGradientBrush> 
     </Border.Background> 
    </Border> 
</Grid> 
</Window> 

ответ

2

Вы используете Binding в Storyboard. Вы не можете использовать ссылки на динамические ресурсы или выражения привязки данных для установки Storyboard или значений свойств анимации. Это потому, что все внутри Style должно быть thread-safe, а система синхронизации должна заморозить Storyboard объектов, чтобы сделать их thread-safe. A Storyboard не может быть заморожен, если он или его дочерние временные рамки содержат динамические ссылки ресурсов или данные binding.

EDIT У этого решения Link есть решение проблемы.

+0

Есть ли способ вокруг этого ограничения? – CurtisHx

+0

Сейчас я обновил ответ с помощью новой ссылки. Он имеет подробное решение для такого рода проблем. сообщите мне, если это сработает для вас. – Vinkal

0

Я не уверен, что ошибка ваших получать фактический cuase но больше проблем, полученные из исходной задачи

попробовать:

<Storyboard x:Key="SlideOut"> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border"> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

Это не имеет смысл для меня, что вы может ссылаться на объект к себе ElementName.

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

  • Нет связанных вопросов^_^