我有一个用户界面,可以使用AdaptiveTrigger适应不同的设备外形.特别是,我有一个基于SplitView的 shell菜单,当最小窗口宽度分别为1000 epx和600 epx时,它有两个状态触发器. 600 epx状态触发器可以在横向模式下触发某些移动设备,具体取决于其外形和比例因子,这是预期的行为.

但是,我注意到在桌面上,600 epx状态触发器在后台触发(将ShellSplitView.displayMode从Overlay更改为CompactOverlay),只要我更改主题设置,例如在暗和亮模式之间切换,更改重音颜色,或切换高对比度模式;在移动模拟器和设备上,当我转到“设置”应用,更改主题设置并返回到我的应用时,它会触发.最奇特的是,这只发生在默认状态,并且只有在我通过调整桌面上的窗口大小或通过旋转移动仿真器或设备来触发任何状态触发器之后才会发生.返回应用程序后再次调整大小/旋转会使问题消失.我以前没有在任何其他应用程序中看到过这种情况,包括微软的应用程序或任何第三方UWP应用程序.

我已经确认这不是由于某些其他代码干扰状态触发器造成的,通过在一个空白的UWP项目中成功地再现问题,只有一个页面只包含具有任意数量视觉状态的SplitView(以及一些文本内容) :

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <visualstatemanager.VisualStateGroups>
            <VisualStateGroup>
                <VisualState>
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="1000"/>
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="ShellSplitView.displayMode" Value="Inline"/>
                        <Setter Target="ShellSplitView.IsPaneOpen" Value="True"/>
                    </VisualState.Setters>
                </VisualState>
                <VisualState>
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="600"/>
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="ShellSplitView.displayMode" Value="CompactOverlay"/>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </visualstatemanager.VisualStateGroups>

        <SplitView
            x:Name="ShellSplitView"
            CompactPaneLength="48"
            displayMode="Overlay"
            IsPaneOpen="False"
            OpenPaneLength="256">
            <SplitView.Content>
                <TextBlock Text="Content"/>
            </SplitView.Content>
            <SplitView.Pane>
                <TextBlock Text="Pane"/>
            </SplitView.Pane>
        </SplitView>
    </Grid>
</Page>

您可以尝试通过创建空白UWP项目,用上述XAML替换MainPage.xaml的内容并运行项目来自己重现问题.

考虑到我所做的只是更改主题设置,我不明白为什么任何状态触发器会触发.实际上,根据MSDN上的this guide,应该自动重新应用SplitView元素属性中反映的默认值:

When you use state triggers,you don’t need to define an empty DefaultState. The default settings are reapplied automatically when the conditions of the state trigger are no longer met.

根据Windows.UI.Xaml.AdaptiveTrigger page本身:

By default,the StackPanel orientation is Vertical. When the window width is >= 720 effective pixels,the VisualState change is triggered,and the StackPanel orientation is changed to Horizontal.

…这一点,加强了我的观点 – 当我改变主题设置时,窗口宽度不会改变,所以我不明白为什么状态触发器会在它不应该启动时启动,为什么只有在我之后通过调整窗口大小或旋转设备来触发状态更改.

那么为什么会发生这种情况,我该如何解决呢?

此问题似乎已在所有设备系列的Windows 10周年更新中得到修复.当状态触发器不应该被激活时,它们将不再激活,并且现在可以正确地重新应用状态触发器之外指定的默认值.

>如果您的应用程序仅在1607分支(build 14393)或更新版本上运行,则不需要此解决方法.请注意,这是指项目属性中指定的最小版本,而不是目标版本.
>如果您的应用程序将在1511分支(构建10586)或1507分支(构建10240)上运行,则需要此解决方法,即使它在具有较新构建的设备上运行正常.

不幸的是,我还没有能够解决这个问题而不仅仅是向VisualStateGroup添加一个默认状态,使用最小维度为0 epx的状态触发器(你不需要任何setter – 你只需要一个状态触发器) :

<visualstatemanager.VisualStateGroups>
    <VisualStateGroup>
        <VisualState>
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="1000"/>
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="ShellSplitView.displayMode" Value="Inline"/>
                <Setter Target="ShellSplitView.IsPaneOpen" Value="True"/>
            </VisualState.Setters>
        </VisualState>
        <VisualState>
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="600"/>
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="ShellSplitView.displayMode" Value="CompactOverlay"/>
            </VisualState.Setters>
        </VisualState>
        <VisualState>
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="0"/>
            </VisualState.StateTriggers>
        </VisualState>
    </VisualStateGroup>
</visualstatemanager.VisualStateGroups>

至于为什么会发生这种情况,我的猜测是visualstatemanager试图在系统主题更新时进入状态,但由于没有为初始(或“默认”或“正常”)状态定义,它必须选择下一个最佳选择.我仍然不明白的是,为什么visualstatemanager必须在系统主题首次更新时更改视觉状态…不要自己刷新ThemeResources?他们为什么要依赖visualstatemanager?

值得注意的是,大多数关于UWP中自适应触发器的第三方教程已经做到了这一点.目前尚不清楚作者是否意识到这个问题,或者他们是否添加了默认状态只是因为他们习惯于在Silverlight / WPF时代这样做.但是,基于上面的文档和其他正确的UWP行为,这可能是一个边缘情况.

xaml – 当我更改主题设置时,为什么我的AdaptiveTrigger会触发?的更多相关文章

  1. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  2. android – 使用房间数据库(房间持久性库)创建触发器

    如何使用RoomPersistence库“创建触发器”解决方法在RoomDatabase上调用getopenHelper().这为您提供了一个SupportsqliteOpenHelper,它具有让人联想到sqliteOpenHelper的API.在那里,调用getWritableDatabase()以获取SupportsqliteDatabase,并在那里使用execsql()来执行您的sql语

  3. android – 使用SQLite触发器来更新“LastModified”字段

    即,触发器可以自动检测哪些表和行正被更新/插入/替换等.并通知设置该行的“last_modified”字段,或者我必须为每个表创建一个单独的触发器?或者如果触发器是一个坏主意,有没有更好的选择?谢谢.解决方法一个简短而甜美的答案给你:>之后,所以触发器有一个有效的表来引用.>您需要为您想要影响的每个表/列组合执行CREATETRIGGER.数据库不会假设,因为另一个表有一个last_modified列,你希望这个行为相同…

  4. 当XAML数据验证失败时,如何让视图模型知道

    我有一个表单,用户可以在其中设置数值过程的参数。尽管该属性是双精度的,但它可能表示布尔值或整数。我不能让Min>;Max或Max<;Min.我已经在XAML中实现了验证,如果数据无效,它会向用户发出视觉警告。Min参数的数据模板如下所示。我希望在参数对象中有一个布尔IsValid属性,以便在用户尝试保存时进行测试。如何从XAML绑定到此IsValid属性?

  5. wpf – 使用Microsoft(或其他)功能区与大型项目和MVVM

    我们是否应该有一个RibbonView和一个Ribbonviewmodel,它将包含功能区中的所有可能项目,每个团队都会将其项目添加到这些V/VM,并定义何时显示它们的逻辑?或者我们是否允许每个视图,视图模型或模块在服务中注册功能区项目,然后让服务在活动视图随注册到该类型的所有项目更改时根据需要呈现功能区?或者有没有更好的方法来实现这种集成?您是否对如何管理多个开发人员常见的单个功能区资源有更好的想法或意见?

  6. ScrollViewer中的WebView带有XAML元素头

    在WebView中,我使用WP8.1加载HTML元素.每当内容超出WebView高度时,滚动都没有问题.我的问题是我在WebView的顶部有XAML元素,它们必须与WebView滚动一起滚动.源代码:每当WebView元素“msgContent”滚动时,我都希望stackpanel“xamlelement”与WebView一起滚动.这里的问题是我们可以通过这2个步骤禁用webview滚动1)设置过度隐藏到加载到webview的html内容2)将webview的高度设置为等于其中加载的html内容.但是当我

  7. xaml – Windows通用响应式设计重新定位

    编辑:我使用一个包含2行和2列的Grid工作,使用AdaptiveTrigger将所有内容从行移动到列,反之亦然.可以通过setter更改RelativePanel附加属性值.语法如下:

  8. xaml – 空列表的列表框项模板

    我有一个列表框,其中包含在XAML中定义的项模板,如下所示:现在我想要的是在列表框的中心显示一行文本,以防该列表框的ItemSource为空.XAML是否支持某种无项目模板?

  9. 如何在WPF中将样式应用于Window Control?

    我正在为App.xaml中的Window设置样式,如下所示:我基本上希望每个Window都将其WindowStyle的属性值设置为None;但它没有用.我在这里想念的是什么?回答问题的人对从具有应用样式的基本窗口继承有一个有趣的想法.

  10. UWP(Windows 10)XAML中的WebBrowser控件

    你能告诉我如何在Windows10XAML中提供浏览器控件吗?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部