10

因此,我刚刚开始重新使用 Windows 应用程序,并且有一些事情我无法按我的意愿工作(可能是因为我找不到任何示例并且 Channel9 视频没有涵盖我的情况)。

这篇文章开始,我决定“重新定位”技术是适合我的应用程序从大屏幕移动到小屏幕的技术。

我所做的是使用 aStackPanel并使用两个 s 更改其方向AdaptiveTrigger(一个用于 0 宽度,另一个用于 720,基于此处的表格)。

这有点工作,但有一些问题我会用一些丑陋的油漆编辑截图来说明。

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

大屏幕

第二个问题与调整大小有关。当空间不足时,绿色部分会被剪切而不是调整大小(您可以看到右边框消失了)。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'sSetter不适用于附加属性,如RelativePanel.RightOf.

有没有人成功地应用这种技术而不必使用代码隐藏?

编辑:

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

4

2 回答 2

4

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

<Setter Target="SomeXAMLObject.(RelativePanel.RightOf)" Value="SomeOtherXAMLObject" />
于 2015-07-12T12:17:42.213 回答
0

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

`<Grid>
 <Grid.RowDefinitions>
  <RowDefinition width="2*"/>
  <RowDefinition width="3*"/>
  <RowDefinition width="1*"/>
 </Grid.RowDefinitions>
</Grid>`
于 2015-07-12T10:00:00.487 回答