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
但似乎 AdaptiveTrigger
的 Setter
不适用于 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" />
所以,我刚刚开始重新使用 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
但似乎 AdaptiveTrigger
的 Setter
不适用于 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" />