VisualState AdaptiveTrigger MinWindowWidth=2160 不起作用

VisualState AdaptiveTrigger MinWindowWidth=2160 doesn't work

MinWindowWidth=2160 的 AdaptiveTrigger 似乎不起作用。我需要它来处理 Microsoft Surface Pro 3 屏幕分辨率 (2160x1440)。

看看下面这个简单的代码:

<Page
    x:Class="TestUWP.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestUWP"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="2160" d:DesignHeight="1440">

    <Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup>
                <VisualState>
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="2160" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="brdMain.Background" Value="#bbbbbb"></Setter>
                    </VisualState.Setters>
                </VisualState>
                <VisualState>
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="brdMain.Background" Value="#303030"></Setter>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Border x:Name="brdMain">
            <TextBlock Text="Testing"></TextBlock>
        </Border>
    </Grid>
</Page>

您会看到,背景颜色始终为黑色 (#303030)。是否有 VisualState 可以处理的最大宽度?有什么想法吗?

谢谢

您必须记住,UWP 中的测量是以有效像素 (epx) 为单位进行的。参见 MSDN。 Surface Pro 3 与其他 Surface 平板电脑一样,具有 HiDPI 显示屏和大于 1 的默认比例因子,这意味着其有效像素分辨率比 2160x1440 ,即使这是其原始分辨率。

SP3 的默认比例因子为 150%,因此 epx 分辨率为 1440x960。因此,即使您最大化 window,window 宽度最多也只有 1440 epx,这意味着 MinWindowWidth="2160" 状态触发器永远不会在具有默认设置的 SP3 上触发。

如果您希望您的状态触发器仅在具有 HiDPI 显示 and/or 特定原始分辨率的平板电脑上触发,您可能需要实施一个自定义状态触发器来检测所有这些条件。你如何做到这一点超出了这个问题的范围。

我认为您的尺码可能不合适。你试过其他的吗?

根据 Official MSDN Screen Sizes and Layouts Documentation 这些是您要使用的尺寸

您可能不想要确切的屏幕尺寸的原因是什么阻止了某人将其调低一点或调高一点?

就个人而言,对于更复杂的布局,我更喜欢为每种尺寸创建单独的视图。它使我可以更好地控制布局。下面是我的使用方法。

在静态应用层面class我有。

    public enum DeviceType
    {
        Desktop = 0,
        Phablet = 1,
        Mobile = 2
    }      

    public static DeviceType CurrentDevice
    {
        get
        {
            ApplicationView view = ApplicationView.GetForCurrentView();
            Rect rect = view.VisibleBounds;

            if (rect.Width >= 1024)
            {
                return DeviceType.Desktop;
            }
            else if (rect.Width >= 720)
            {
                return DeviceType.Phablet;
            }
            else
            {
                return DeviceType.Mobile;
            }
        }
    }

然后在我的控制下,我只需在我的静态构造函数中访问我的静态 class。如果我是移动设备,我会加载一个移动 DefaultStyleKey。如果我是台式机,那么我会加载 DesktopDefaultStyleKey。

    DeviceType device = ApplicationServices.CurrentDevice;

    switch (device)
    {
       case (DeviceType.Desktop):
            YoutubeVideosPresenter.Content = new YouTubeVideosLayoutDesktop();
            break;
       case (DeviceType.Mobile):
            YoutubeVideosPresenter.Content = new YouTubeVideosLayoutMobile();
            break;
     }         

当然这不是很"adaptive"如果有人操纵window宽度。不过,您可以通过检查 window 宽度是否已更改来轻松解决此问题,然后可以轻松切换样式。