2012-01-05 44 views
0

設計人員創建了一些XAML VisualState代碼,該代碼在構建爲XAML時可以正常工作。現在我的任務是將此XAML轉換爲Code Behind,它是一個從ChildWindow繼承的自定義Template控件,它將構建動畫以在各種「窗口」(即所有子UserControls)之間轉換到此ChildWindow。將XAML轉換爲用於動態控制的代碼

我已經寫了所有的代碼,但是當我運行任何動畫,我得到一個錯誤的Silverlight「無法解析targetproperty‘(UIElement.Projection)。(PlaneProjection.RotationY)’」

這是原始XAML

<VisualState x:Name="AtRegistration"> 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WindowContentPresenter" Storyboard.TargetProperty="(Content).Children[0].(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="Collapsed" /> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="WindowContentPresenter" Storyboard.TargetProperty="(Content).Children[1].(UIElement.Visibility)"> 
      <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="Visible" /> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 
<VisualState x:Name="AtLogin"> 
    <Storyboard> 
     ... XAML omitted ... 
    </Storyboard> 
</VisualState> 
<VisualStateGroup.Transitions> 
    <VisualTransition From="AtRegistration" To="AtLogin"> 
     <Storyboard> 
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ContentRoot" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)"> 
       ... XAML OMITTED ... 
      </DoubleAnimationUsingKeyFrames> 
      ... XAML OMITTED ... 
     </Storyboard> 
    </VisualTransition> 
    <VisualTransition From="AtLogin" To="AtRegistration"> 
     ... XAML OMITTED ... 
    </VisualTransition> 
</VisualStateGroup.Transitions> 

... XAML省略......

以上XAML工作正常,但是當我寫的代碼,這不。我假設它的代碼我做錯了,但我找不到它。

public override void OnApplyTemplate() 
{ 
base.OnApplyTemplate(); 

var content = (ContentPresenter)GetTemplateChild("WindowContentPresenter"); 
m_contentRoot = (Grid)GetTemplateChild("ContentRoot"); 

var grid = (Grid)GetTemplateChild("Root"); 

if(grid != null) 
{ 
    // Create the state group 
    var animGroup = new VisualStateGroup(); 
    animGroup.SetValue(NameProperty, "AnimationStates"); 

    var grp = VisualStateManager.GetVisualStateGroups(grid); 
    grp.Add(animGroup); 

    for(int i = 0; i < MultiControls.Count; i++) 
    { 
     var state = new VisualState(); 
     state.SetValue(NameProperty, GetControlName(i)); 
     animGroup.States.Add(state); 

     state.Storyboard = new Storyboard(); 

     // create an animation for each of the multi controls 
     for(int j = 0; j < MultiControls.Count; j ++) 
     { 
      // Create the storyboard 
      var anim = new ObjectAnimationUsingKeyFrames(); 
      Storyboard.SetTarget(state.Storyboard, content); 
      anim.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(string.Format("(Content).Children[{0}].(UIElement.Visibility)", j))); 
      anim.KeyFrames.Add(new DiscreteObjectKeyFrame 
            { 
             KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0)), 
             Value = j == i ? Visibility.Visible : Visibility.Collapsed 
            }); 

      state.Storyboard.Children.Add(anim); 

      // Don't create a transition to and from the other states. 
      if(i == j) 
       continue; 

      // Create the Transition 
      var trans = new VisualTransition { From = GetControlName(j), To = GetControlName(i) }; 
      animGroup.Transitions.Add(trans); 
      trans.Storyboard = new Storyboard(); 

      var dbl = new DoubleAnimationUsingKeyFrames { BeginTime = TimeSpan.FromSeconds(0) }; 
      Storyboard.SetTarget(trans.Storyboard, m_contentRoot); 
      dbl.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.Projection).(PlaneProjection.RotationY)")); 
      trans.Storyboard.Children.Add(dbl); 

      ... CODE OMITTED ... 
     } 
    } 
} 
} 

在我的模板XAML我有這樣的:

<Grid x:Name="Overlay" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="0" Background="{TemplateBinding OverlayBrush}" Opacity="{TemplateBinding OverlayOpacity}"/> 
<Grid x:Name="ContentRoot" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" RenderTransformOrigin="0.5,0.5" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"> 
<Grid.Projection> 
    <PlaneProjection/> 
</Grid.Projection> 

難道你們/加侖有什麼想法?

謝謝。

+0

您是否嘗試將var dbl添加到故事板兒童,然後設置它的值? – evasilchenko 2012-01-05 16:30:00

+0

我試過了:var dbl = new DoubleAnim .....(); trans.Storyboard.Children.Add(dbl);然後設置它的所有屬性,但這並沒有解決問題。 – guyaton 2012-01-05 19:03:58

+0

嘗試更改PropertyPath字符串以讀取「UIElement.Projection。(PlaneProjection.RotationY)」 - 注意刪除第一個括號。基本上,你需要玩這條路,因爲在source和xaml中定義這個路徑會有所不同。 – evasilchenko 2012-01-05 19:15:17

回答

0

Storyboard.SetTarget的第二個參數應該是投影,而不是m_contentroot。然後,您需要在路徑中指定「RotationY」。