Windows 通用响应式设计重新定位

Windows Universal responsive design reposition

所以,我刚刚开始重新使用 Windows 应用程序,但有些东西我无法按我想要的方式工作(可能是因为我找不到任何示例和 Channel9 视频没有涵盖我的情况)。

this article 开始,我认为 "reposition" 技术是适合我的应用程序从大屏幕移动到小屏幕的技术。

我所做的是使用 StackPanel 并使用两个 AdaptiveTrigger 更改其方向(一个宽度为 0,另一个宽度为 720,基于 table here).

这有点管用,但有一些问题我会用一些丑陋的绘画编辑截图来说明。

这是当我处于 BigScreen 情况时发生的情况,其中有足够的 space 将 A 和 B 放在同一行。这里的问题是B应该占满剩余宽度,覆盖所有蓝色部分。

第二个问题与调整大小有关。当 space 不够时,绿色部分会被剪切而不是调整大小(你可以看到右边的边框消失了)。在使用 StackPanel 使布局响应之前,这并没有发生。

最后,当我们在 SmallScreen 的情况下,方向变为垂直,我们遇到了与第一个相同的问题:绿色部分的高度没有填满屏幕。

这是用于页面的 XAML

<Page
    x:Class="Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WifiAnalyzerFinal.Views"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:mvvm="using:Mvvm"
    mc:Ignorable="d">        

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="SmallScreen">
            <VisualState>
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0"/>
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="StackPanel.Orientation" 
                            Value="Vertical"/>
                </VisualState.Setters>
            </VisualState>
            </VisualStateGroup>
            <VisualStateGroup x:Name="BigScreen">
            <VisualState>
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="720"/>
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="StackPanel.Orientation" 
                            Value="Horizontal"/>
                    <Setter Target="Rect.Width" 
                            Value="200"/>
                        <Setter Target="Rect.Height" 
                            Value="Auto"/>
                    </VisualState.Setters>
            </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <StackPanel Orientation="Vertical"
                    Background="Blue"
                    x:Name="StackPanel">
            <Rectangle Fill="Red" 
                       Height="50"
                       x:Name="Rect"
                       Width="Auto"/>
            <ListView ItemsSource="{Binding Stuff}"
                      HorizontalAlignment="Stretch"
                      HorizontalContentAlignment="Stretch"
                      VerticalAlignment="Stretch"
                      Background="Green"
                      Width="Auto"
                      BorderBrush="DarkGreen"
                      BorderThickness="5"
                      Padding="5">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                        <Setter Property="Margin" Value="0,0,0,5"/>
                    </Style>
                </ListView.ItemContainerStyle>
            </ListView>
        </StackPanel>
    </Grid>
</Page>

请注意,如果没有 StackPanel,绿色部分将适合页面,覆盖所有可用区域。不幸的是,我无法想出更好的解决方案,因为没有示例告诉我们应该如何实施这项技术。我也尝试使用新的 RelativePanel 但似乎 AdaptiveTriggerSetter 不适用于 RelativePanel.RightOf.

等附加属性

是否有人成功地应用了此技术而无需使用代码隐藏?

编辑:

我使用具有 2 行和 2 列的 Grid 来完成这项工作,AdaptiveTrigger 将所有内容从行移动到列,反之亦然。

您为什么不尝试使用网格(而不是 StackPanel)并使用比例尺寸定义行,例如:

`<Grid>
 <Grid.RowDefinitions>
  <RowDefinition width="2*"/>
  <RowDefinition width="3*"/>
  <RowDefinition width="1*"/>
 </Grid.RowDefinitions>
</Grid>`

可以通过设置器更改附加的 RelativePanel 属性 值。语法如下:

<Setter Target="SomeXAMLObject.(RelativePanel.RightOf)" Value="SomeOtherXAMLObject" />