2012-10-17 13 views
7

Ho definito i seguenti due stati in Expression Blend. Ho provato a seguire la guida this ma sento che mi lascia in sospeso quando ho bisogno di informazioni su come e quando cambiare stato.Come modificare VisualState in WP7

enter image description here

Secondo la guida devo applicare un comportamento (presumo "GotoState") al mio UserControl - Purtroppo non credo che in realtà hanno un User Control - e anche se l'avessi fatto, avrei è necessario allegare un comportamento a entrambi i miei PortraitState e al mio LandscapeState?

Sembra che sia possibile collegare un GotoState all'elemento LayoutRoot. Quindi attribuisco il mio comportamento a quello in entrambi gli stati? Qualsiasi aiuto sarebbe molto apprezzato.

* modifica: stavo giocando nel mio file xaml.cs e ho capito che questo poteva essere il modo di farlo a livello di programmazione. quando eseguo il debug e cambio l'orientamento, inserisco la mia centralina e trovo l'orientamento corretto. Lo stato, tuttavia, non viene mai cambiato. Che cosa sto facendo di sbagliato?

protected override void OnOrientationChanged(OrientationChangedEventArgs e) 
    { 
     switch (e.Orientation) 
     { 
      case PageOrientation.Landscape: 
       ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "LandscapeState", useTransitions: true); 
       break; 
      case PageOrientation.LandscapeRight: 
       ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "LandscapeState", useTransitions: true); 
       break; 
      case PageOrientation.LandscapeLeft: 
       ExtendedVisualStateManager.GoToElementState(root:LayoutRoot, stateName: "LandscapeState", useTransitions: true); 
       break; 
      case PageOrientation.Portrait: 
       ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true); 
       break; 
      case PageOrientation.PortraitUp: 
       ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true); 
       break; 
      case PageOrientation.PortraitDown: 
       ExtendedVisualStateManager.GoToElementState(root:this.LayoutRoot, stateName: "PortraitState", useTransitions: true); 
       break; 
      default: 
       break; 
     } 
    } 

EDIT2: Quando si tenta quanto sopra sembra che GotoElementState restituisce false e, secondo MSDN: "restituisce true se il controllo transizione con successo al nuovo stato, altrimenti false"

Ora mi rimane la domanda: cosa può causare il fallimento della transizione dello stato?

risposta

1

sono riuscito a trovare una soluzione al mio problema facendo quanto segue.

Si scopre che l'utilizzo di ExtendedVisualStateManager.GotoElementState (UIElement, String, bool) non funziona molto bene al momento, quindi sono stato costretto a trovare un modo per utilizzare VisualStateManager.GotoState.

ho risolto il problema semplicemente confezionamento mia LayoutRoot in un UserControl come tale:

<UserControl x:Name="userControl"> 
    <Grid x:Name="LayoutRoot" Background="Transparent"> 
     <VisualStateManager.VisualStateGroups> 
    ... 
</UserControl> 

stati di commutazione ora era semplicemente una questione di chiamare VisualStateManager.GotoState come inizialmente ho cercato di fare.

protected override void OnOrientationChanged(OrientationChangedEventArgs e) 
    { 
     base.OnOrientationChanged(e); 

     switch (e.Orientation) 
     { 
      case PageOrientation.Landscape: 
      case PageOrientation.LandscapeRight: 
      case PageOrientation.LandscapeLeft: 
       VisualStateManager.GoToState(control: userControl, 
                 stateName: "LandscapeState", 
                 useTransitions: true); 
       break; 
      case PageOrientation.Portrait: 
      case PageOrientation.PortraitUp: 
      case PageOrientation.PortraitDown: 
       VisualStateManager.GoToState(control: userControl, 
                 stateName: "PortraitState", 
                 useTransitions: true); 
       break; 
      default: 
       VisualStateManager.GoToState(control: userControl, 
            stateName: "PortraitState", 
            useTransitions: true); 
       break; 
     } 
    } 
1

cambiamento del VisualState in WP7 in questo modo:

switch (e.Orientation) 
    { 
     case PageOrientation.Landscape: 

      VisualStateManager.GoToState(this, "LandscapeState", true); 

      break; 

     case PageOrientation.Portrait: 

      VisualStateManager.GoToElementState(this,"PortraitState", true); 

      break; 

     default: 

      break; 
    }