VisualState AdaptiveTrigger MinWindowWidth = 2160不起作用

时间:2016-07-21 12:28:16

标签: xaml uwp windows-10-universal uwp-xaml

具有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可以处理的最大宽度?有什么想法吗?

由于

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

我认为您的尺码可能会关闭。你有没有尝试过其他人?

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

enter image description here

你可能不想要确切的屏幕大小的原因是因为什么阻止某人将其调低一点或稍微调整一下?

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

在我的静态应用程序级别中。

    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;
            }
        }
    }

然后在我的控制中,我只是在静态构造函数中访问我的静态类。如果我是移动设备,我加载一个移动DefaultStyleKey。如果我是桌面版,那么我加载DesktopDefaultStyleKey。

    DeviceType device = ApplicationServices.CurrentDevice;

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

当然,如果有人操纵窗口宽度,这不是很“自适应”。您可以通过检查窗口宽度是否已更改然后轻松切换出来来轻松完成此操作。