2016-08-03 54 views
0

我想知道如何为UWP应用程序构建XAML布局,这对所有设备都很好。我做了一个由网格和堆叠面板组成的布局,当我在我的电脑上本地启动它时,它在最小尺寸(移动)上非常漂亮。UWP - 使用XAML为所有设备构建漂亮的布局

enter image description here

当我调整它的大小(平板电脑),它看起来不是很好,但它传递

enter image description here

在桌面上这是一个耻辱......

enter image description here

灰色部分是我想在平板电脑和台式机上使用的部分,暂时不使用但我会把内容。

然后,我尝试在真实设备上的手机大小和惊喜,我看不到所有的内容。它被截断在第二行下方(灰色和蓝色按钮下方)。我想我必须找到一个scrollview或像这样的东西,并把它放在我的网格。

但最重要的问题是你如何建立你的XAML以适应所有的设备尺寸?例如,我想广场作为按钮,但在平板电脑和桌面上,它看起来像矩形...如果我调整网格,以适应平板电脑和桌面上的广场,然后我在手机上的行之间有大的空白。它让我头痛......

有人建立这样的布局?有人可以帮助我了解如何改善我的布局?下面的代码我写...

<Page 
x:Class="RescueCode.UWP.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:RescueCode.UWP" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" MinHeight="800"> 
<Page.TopAppBar> 
    <CommandBar> 
     <CommandBar.Content> 
      <Grid/> 
     </CommandBar.Content> 
     <AppBarButton Name="update" Icon="Download" Click="AppBarButton_Click"/> 
    </CommandBar> 
</Page.TopAppBar> 

<Grid Background="White" x:Name="MainGrid" > 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="2*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="188*"/> 
     <RowDefinition Height="179*"/> 
     <RowDefinition Height="409*"/> 
    </Grid.RowDefinitions> 

    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState x:Name="WideState"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="720" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="MainGrid.Margin" Value="24"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="NarrowState"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="0" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="MainGrid.Margin" Value="12"/> 
        <Setter Target="MainGrid.ColumnDefinitions[2].Width" Value="0"/> 
       </VisualState.Setters> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 


    <StackPanel x:Name="g1" Grid.Column="0" Grid.Row="0" Padding="20" Orientation="Vertical"> 
     <TextBlock Text="Test" FontSize="20"/> 
     <Button x:Name="cameraButton" Click="cameraButton_Click" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#F15A22" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
      <Image x:Name="cameraImage" Source="Assets/scan.png" NineGrid="0" Margin="20,20,20,20" Stretch="UniformToFill"/> 
     </Button> 
    </StackPanel> 

    <StackPanel x:Name="g2" Grid.Column="1" Grid.Row="0" Padding="20" Orientation="Vertical"> 
     <TextBlock Text="Test" FontSize="20"/> 
     <Grid> 
      <Button x:Name="searchButton" Click="searchButton_Click" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0" Background="#f7a600" > 
       <Image x:Name="searchImage" Source="Assets/search.png" NineGrid="0" Margin="20,20,20,20"/> 
      </Button> 
     </Grid> 
    </StackPanel> 

    <Grid x:Name="g3" Grid.Column="2" Grid.Row="0" Background="Gray" > 
     <TextBox Text="3"/> 
    </Grid> 

    <StackPanel x:Name="g4" Grid.Column="0" Grid.Row="1" Padding="20" Orientation="Vertical"> 
     <TextBlock Text="Test" FontSize="20"/> 
     <Button x:Name="aboutButton" Content="Test" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0,20,0,0" Background="#6c7778"/> 
     <Button x:Name="applicationButton" Content="Test" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0,20,0,0" Background="#00ADEF"/> 
    </StackPanel> 

    <StackPanel x:Name="g5" Grid.Column="1" Grid.Row="1" Padding="20" Orientation="Vertical" > 
     <TextBlock Text="Site" FontSize="20"/> 
     <Button x:Name="websiteButton" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0" Background="#fc0" Click="websiteButton_Click"> 
      <Image x:Name="websiteImage" Source="Assets/website.png" NineGrid="0" Margin="20,20,20,20"/> 
     </Button> 
    </StackPanel> 

    <Grid x:Name="g6" Grid.Column="2" Grid.Row="1" Background="Gray" > 
     <TextBox Text="6"/> 
    </Grid> 

    <Grid x:Name="g7" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Padding="20" > 
     <StackPanel x:Name="s7" Orientation="Vertical"> 
      <TextBlock Text="Test" FontSize="20"/> 
      <TextBlock Margin="0,20,0,0" TextWrapping="Wrap" Text="fejnfkjbshbcjhsdbvhdskjbcvjhskdnbckjscnkjdsncjnsdcjsdnbvjdjvsjhvlkenjlzsevnljhnjvklevbksvbjkdbnskjdjsdnvkjnkjvnkdjbkdjvbsdkjbvkdjvbkdjbskjvbekvbjdvb ." FontSize="14"/> 
     </StackPanel> 
    </Grid> 

    <Grid x:Name="g9" Grid.Column="2" Grid.Row="2" Background="Gray" > 
     <TextBox Text="9"/> 
    </Grid> 

</Grid> 

谢谢大家的帮忙!我很欣赏:)

+0

听起来像是你应该计算器上的文件要求。 – IInspectable

+3

使用VisualStateManager,因为你得到了[在你以前的问题中回复](http://stackoverflow.com/a/38713984/318501) – Bart

回答

1

如前所述在以前讨论的评论,StackPanel有不确定的高度,你接受的答案存在已经可以解决你的问题,与解决方案,您的桌面布局应该是例如这样的:

enter image description here

由于您的按钮总是适合舒展自己的大小以适合容器,你的按钮可能是矩形的,但你的图像看起来像所有的正方形。既然你再次提出这个问题,我的猜测是你想保持你的按钮是方形的?

如果是这样,一个方法是,你仍然可以使用VisualStateManager在布局定义每个按钮的大小,因为我在你的最后一个问题提出,这一次我提供了另一种方法,你可以设置一个ScrollViewer外的MainGrid的并将您的VisualStateManager移动到此布局的根控件(现在是ScrollViewer)。

你的问题实际上是没有足够的高度来容纳你的按钮的父母。在StackPanels,以确保有有足够的高度,ScrollViewer可以有很大的帮助:

<ScrollViewer> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState x:Name="WideState"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="720" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="MainGrid.Margin" Value="24"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="NarrowState"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="0" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="MainGrid.Margin" Value="12"/> 
        <Setter Target="MainGrid.ColumnDefinitions[2].Width" Value="0"/> 
       </VisualState.Setters> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

    <Grid Background="White" x:Name="MainGrid" > 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
      <ColumnDefinition Width="2*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="188*"/> 
      <RowDefinition Height="179*"/> 
      <RowDefinition Height="409*"/> 
     </Grid.RowDefinitions> 

     <!--your layout without VisualStateManager--> 

    </Grid> 
</ScrollViewer> 

这工作不错,但让一个问题,我认为是一件好事,这将削减在年底的空白你的布局是这样的:

enter image description here