2013-12-19 53 views
1

我想在用戶導航到應用程序中的某個頁面時以及從某個頁面導航時製作簡單的動畫。以下是我對現在:Storyboard.Completed和OnNavigatingFrom。如何正確地做動畫?

XAML:

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.Projection> 
     <PlaneProjection CenterOfRotationY="1"/> 
    </Grid.Projection> 
    <Grid.Resources> 
     <Storyboard x:Name="OnNavTo"> 
      <DoubleAnimation 
       Storyboard.TargetName="LayoutRoot" 
       Storyboard.TargetProperty="(Projection).(PlaneProjection.RotationX)" 
       From="-110" To="0" Duration="0:0:0.3" /> 
     </Storyboard> 
     <Storyboard x:Name="OnNavFrom"> 
      <DoubleAnimation 
       Storyboard.TargetName="LayoutRoot" 
       Storyboard.TargetProperty="(Projection).(PlaneProjection.RotationX)" 
       From="0" To="-110" Duration="0:0:1.3" /> 
     </Storyboard> 
    </Grid.Resources> 
    <phone:Pivot Title="{Binding LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"> 
     <!-- My page stuff here --> 
    </phone:Pivot> 
</Grid> 

C#:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
    OnNavTo.Begin(); 
} 

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    base.OnNavigatedFrom(e); 
    OnNavFrom.Begin(); 
} 

的OnNavigatedTo工作正常。當我點擊按鈕打開適當的頁面時,它會打開動畫。但是,當我按下後退按鈕時,頁面就會關閉,不會有任何動畫。 請指點我正確的方向

(我是後端python開發人員,絕對noob在Windows Phone和.NET的東西)。

UPD 正如gaurav5430指出的那樣。

第一:我已經注意到,我使用的OnNavigatedFrom代替OnNavigatingFrom

二:動畫是異步的,所以我需要等到它完成之前實際關閉頁面。在這一點上,我來到了以下情況:

XAML:<Storyboard x:Name="OnNavFrom" Completed="OnNavFrom_Completed">

C#:

private bool cancelExit = true; 

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
{ 
    e.Cancel = cancelExit; 
    if (cancelExit) 
    { 
     OnNavFrom.Begin(); 
    } 
    else 
    { 
     base.OnNavigatingFrom(e); 
    } 
} 

private void OnNavFrom_Completed(object sender, EventArgs e) 
{ 
    cancelExit = false; 
    NavigationService.GoBack(); 
} 

它的工作。雖然我明白這不是處理事件的最佳方式。我很確定C#有很好的方法來做到這一點,而不需要調用NavigationService兩次(第一次當用戶按下後,第二次當動畫完成時)。 gaurav5430提供的鏈接包含代碼示例。但我不明白它是如何工作的。對於像我這樣的新手來說,我認爲這段代碼太小,無法理解幕後的情況。

所以

回答

1

這是很可能的是,網頁已經從導航和不等待動畫完成。

我的建議是調用所有的函數調用base.OnNavigatedFrom(e)之前,因爲這可能是它設置了導航功能,所以基本上你可以嘗試

protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
    OnNavFrom.Begin(); 
     base.OnNavigatedFrom(e); 

    } 

請注意,這仍然不能讓確保它等待您的動畫完成,因爲動畫可能會播放異步。所以也許你可以嘗試添加調用base.OnNavigatedFrom()

前有延遲也可能會檢查這個環節出

http://www.silverlightshow.net/items/Windows-Phone-7-Part-3-Understanding-navigation.aspx

+0

謝謝你指點我正確的方向和鏈接。我認爲你的回覆和鏈接包含處理該問題的所有信息。但我仍然不知道如何。我已經更新了我的問題。 – user3119288

0

感謝,並在此基礎上,我不得不添加一些改進。

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    //base.OnNavigatedTo(e); //this call isn't necessary 
    if (e.NavigationMode == NavigationMode.New) 
    { 
     storyboardTo.Begin(); 
    } 
    //if NavigationMode is Back then don't play the animation 

    //... 
} 

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
{ 
    if (e.NavigationMode != NavigationMode.Back) 
    {//leave the page due to long back button or Windows button, stay on the page 
     e.Cancel = true; 
     return; 
    } 

    //... 
    //base.OnNavigatingFrom(e); //this call isn't necessary 
    //... 
}