2015-12-18 2 views
0

Я пытаюсь изменить свои взгляды на основе пейзажной и портретной ориентации.изменить раскладку на основе определения ориентации в xaml Windows app

Я попробовал код из нескольких мест, например:

  1. How to detect orientation changes and change layout?

  2. https://social.msdn.microsoft.com/Forums/en-US/a2064993-e4a9-4a58-8498-ef03ed9403f4/how-to-set-grid-row-property-in-visualstatemanager-in-windows8-app?forum=winappswithcsharp

, но он не работает для меня. Не уверен, что я делаю неправильно. Я тестирую его с симулятора.

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*" /> 
      <RowDefinition Height="1*" /> 
      <RowDefinition Height="18*" /> 
     </Grid.RowDefinitions> 
<Grid/> 
<Grid Grid.Row=1/> 
<Grid Grid.Row="2"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="4*" /> 
     <RowDefinition Height="14*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Grid Grid.Row="0" x:Name="PageTotals" /> 

    <Grid Grid.Row="1" x:Name="PageDetails" /> 

    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="ApplicationViewStates"> 
      <VisualState x:Name="Filled"/> 
      <VisualState x:Name="FullScreenPortrait"/> 
      <VisualState x:Name="Snapped"/> 
      <VisualState x:Name="FullScreenLandscape"> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PageTotals" 
              Storyboard.TargetProperty="(Grid.Column)"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="0"/> 
        </ObjectAnimationUsingKeyFrames> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PageTotals" 
              Storyboard.TargetProperty="(Grid.RowSpan)"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="2"/> 
        </ObjectAnimationUsingKeyFrames> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PageDetails" 
              Storyboard.TargetProperty="(Grid.Column)"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="1"/> 
        </ObjectAnimationUsingKeyFrames> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PageDetails" 
              Storyboard.TargetProperty="(Grid.RowSpan)"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="2"/> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
</Grid> 
+0

Я ориентирую Windows 8.1 (приложение Windows) –

+0

Добро пожаловать в StackOverflow. Если ответ разрешил ваш вопрос, пожалуйста, рассмотрите [принять его] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – Bart

ответ

0

Автоматические триггеры для VisualStates было что-то введено с LayoutAwarePage в Windows 8. Однако с ОС Windows 8.1, понятие Snapped экран был удален, и руководство должно было разработать приложение для 320px (установка в манифесте) или 500px (по умолчанию) как минимальный размер. Автоматические триггеры при изменении ориентации также были сняты .

Есть, однако, образцы разработчиков, которые пытались воспроизвести поведение Windows 8, например this post from Jeremy Likness. Вы все равно можете написать/использовать код, похожий на его реализацию, на существующие 8.1 API, чтобы проверить ориентацию, и если ваше приложение полноэкранное, а затем перейдите в нужное состояние с помощью VisualStateManager.GoToState.

private static void SetLayout(Control control) 
{ 
    var orientation = ApplicationView.GetForCurrentView().Orientation; 
    string newMode; 

    if (orientation == ApplicationViewOrientation.Landscape) 
    { 
     newMode = ApplicationView.GetForCurrentView().IsFullScreen ? "FullScreenLandscape" : "Filled"; 
    } 
    else 
    { 
     newMode = Window.Current.Bounds.Width <= 500 ? "Snapped" : "FullScreenPortrait"; 
    } 

    if (newMode == GetLastOrientation(control)) 
    { 
     return; 
    } 

    VisualStateManager.GoToState(control, newMode, true); 
    SetLastOrientation(control, newMode); 
} 

Jeremy's post.

+0

Есть ли способ сделать то же самое из стиля с помощью доски объявлений? –

+0

Все изменения стилей остаются в вашем раскадровке. Это только переключение между состояниями, которые когда-то были в «LayoutAwarePage», которые вам нужно сделать сейчас. – Bart

+0

Спасибо, брату попробуем и обновим сообщение –

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