2012-06-11 8 views
8

Digamos que tengo una cuadrícula con 2 filas, 2 columnas y muchos controles dentro de cada celda.¿Cómo detectar cambios de orientación y cambiar el diseño?

Cuando la aplicación cambia al modo instantáneo, quise decir 1/3 de la pantalla. Me gustaría que la aplicación fuera solo, una columna, 2 filas y mostrar solo algunos controles que decidiría.

¿Qué tipo de control tengo para esto?

THX

Respuesta

8

usted debe hacer uso de la VisualStateManager en XAML, para una solución completa xaml:

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="OrientationStates"> 
      <VisualState x:Name="Full"/> 
      <VisualState x:Name="Fill"/> 
      <VisualState x:Name="Portrait"/> 
      <VisualState x:Name="Snapped"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
</Grid> 

Crear Historietas para cada VisualState y elementos de ocultar/mostrar en su xaml. Los ejemplos de Microsoft usan la misma solución.

-

actualización

He buscado en la red y encontré los estados apropiados, un ejemplo está detrás de este enlace: MSDN.

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="ApplicationViewStates"> 
     <VisualState x:Name="FullScreenLandscape"/> 
     <VisualState x:Name="Filled"/> 
     <VisualState x:Name="FullScreenPortrait"/> 
     <VisualState x:Name="Snapped"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Los estados reflejan el ApplicationViewState enum. Se puede encontrar incluso más información here.

+0

puede por favor elaborar ¿Su respuesta es más ?, con su ayuda podría obtener este enlace, http://www.markermetro.com/2011/11/technical/windows-8-metro-style-apps-layout-and-orientation-management-with- xaml /, entonces significa que tengo que escribir un diseño diferente para cada estado visual, y volver a vincular los datos en cada cambio de orientación a los controles correctos dependiendo del estado? –

+0

¡Sí!De hecho, esa sería la solución más bella, xaml, afaik. Con algunos storyboards inteligentes podrías reutilizar algunos de tus elementos, pero en su mayoría tendrías que crear diseños diferentes. Si lo hace, sería conveniente cambiarlos a UserControls o Views separados e incluirlos. – Kolky

+0

Lo siento, era un poco estrecho de miras. Microsoft creó una clase de página base que admite estos VisualStates. Actualicé mi publicación con un ejemplo más útil ... – Kolky

9

Usando DisplayProperties.OrientationChanged evento (como lo sugiere @Jan K.) puede no ser exactamente lo que está buscando, teniendo en cuenta el apartado de observaciones a este evento:

El DisplayProperties.OrientationChanged evento ocurre sólo cuando la orientación de la pantalla o monitor cambia y no necesariamente cuando cambia la orientación de su aplicación. Para determinar la orientación de su aplicación para fines de diseño, use la propiedad ApplicationView.Value.

pero desde ApplicationView.Value probablemente será abandonado después de de Windows 8.1 liberación MS aconseja la utilización de ApplicationView.GetForCurrentView() lugar:

métodos estáticos ApplicationView se pueden alterar o no está disponible para las versiones de Windows después de 8.1 Vista previa. En su lugar, use ApplicationView.GetForCurrentView() para obtener una instancia de ApplicationView.

Así que por ahora he terminar con ese código (una especie de visión dinámica y no se puede pre-diseñar todo en XAML a través VisualStateManager, por desgracia):

public MainPage() 
{ 
    InitializeComponent(); 
    Window.Current.SizeChanged += (sender, args) => 
    { 
     ApplicationView currentView = ApplicationView.GetForCurrentView(); 

     if (currentView.Orientation == ApplicationViewOrientation.Landscape) 
     { 
      // when args.Size.Width > args.Size.Height 
     } 
     else if (currentView.Orientation == ApplicationViewOrientation.Portrait) 
     { 
      // when args.Size.Width < args.Size.Height 
     } 
    }; 
} 
Cuestiones relacionadas