2015-09-14 5 views
1

У меня есть два файла MyPagePort.xaml и MyPageLand.xaml для портретной и альбомной ориентации. Я также хочу иметь «интегратор» MyPage.xaml, , который использует VisualStateManager для переключения между портретным и ландшафтным макетом.Включая несколько файлов xaml в xaml (Windows Universal)

<VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState x:Name="Portrait> 
       include MyPagePort.xaml 
      </VisualState> 
      <VisualState x:Name="Landscape"> 
       include MyPageLand.xaml 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

Проблема в том, что я не могу найти способ включить несколько XAML. Мне просто нужно что-то похожее на «incluide» в Android.

Я нашел несколько примеров WPF для этого (или), но ни один из них не работает с Windows Universal.

ответ

0

Возможно т он наилучшим образом будет использовать пользовательские элементы управления, поэтому я могу иметь два пользовательских элемента управления для горизонтальной и вертикальной компоновки. Один из способов сделать один видно, другой коллапс и переключатель видимость в зависимости от ориентации:

<Grid x:Name="ContentPanel"> 
    <layouts:MainPagePort x:Name="ContentPortrait" /> 
    <layouts:MainMenuLand x:Name="ContentLandscape" Visibility="Collapsed" /> 


    </Grid> 

    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState x:Name="Portrait"/> 
      <VisualState x:Name="Landscape"> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
         Storyboard.TargetName="ContentPortrait" 
         Storyboard.TargetProperty="Visibility"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed" /> 
        </ObjectAnimationUsingKeyFrames> 

        <ObjectAnimationUsingKeyFrames 
         Storyboard.TargetName="ContentLandscape" 
         Storyboard.TargetProperty="Visibility"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup > 
    </VisualStatemanager.VisualStateGroups> 

Однако такой подход имеет существенный недостаток (и это может быть, почему Стамос не рекомендует поддерживать два макеты), но есть выход: если компоновка сложная, неиспользованный будет тратить пространство и затрудняет запуск приложения (особенно на телефоне). Произведение вокруг удаляет ненужное дерево компоновки и один необходимый:

public async void Window_SizeChanged (object sender, WindowSizeChangedEventArgs e) 
    { 

     ApplicationViewOrientation newOrientation = OrientationUtils.getScreenOrientation(); 
     if (newOrientation != curOrientation) 
      { 
       curOrientation = newOrientation; 
       setupOrientation(); 
      } 
    } 

    private void setupOrientation() 
    { 
      Panel contentPane = FindName("ContentPanel") as Panel; 
      if (contentPane != null) { 
      var children = contentPane.Children; 
      try 
      { 
       children.Remove(children.Where(child => ((Control)child).Name.Equals("ContentChild")).First()); 
      } 


       String layoutPath = "ms-appx:///MainPage" + 
        ((curOrientation == ApplicationViewOrientation.Portrait) ? "Port" : "Land") + 
         ".xaml"; 
       var newElement = new UserControl(); 
       Application.LoadComponent(newElement, new Uri(layoutPath), 
          ComponentResourceLocation.Application); 
       newElement.Name = "ContentChild"; 
       children.Add(newElement); 
     } 
    } 
1

Я считаю, что способ, которым вы пытаетесь достичь портретной и ландшафтной ориентации, не является лучшей практикой и ее неправильным. Но если вы настаиваете на том, чтобы делать это неправильно, попробуйте использовать элемент Frame.

<Frame x:Name="frame" HorizontalAlignment="Left" VerticalAlignment="Top"/> 

и сделать

frame.Navigate(typeof(YourPage)); 

Для наилучшей практики попробовать (вы также можете найти интегратора)

+0

Я не вижу ничего плохого об обработке две ориентации, и я делаю именно то, что было предложено здесь: использование VisualStateManager для переключения между ориентацией, только с помощью В моем случае сетка будет не совсем подходящей. Вопрос был довольно техническим: как обращаться к нескольким XAML, учитывая, что не совсем удобно разрабатывать оба макета в одном XAML. – cyanide

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