我有一个用户界面,使用
然而,我注意到在桌面上,只要我更改主题设置(如在深色和浅色模式之间切换、更改强调颜色或切换高对比度模式),就会在后台触发600 epx状态触发器(将
我已经确认这不是由其他代码干扰状态触发器引起的问题,通过在一个空的UWP项目中成功重现该问题,该项目仅包含一个只有
您可以尝试通过创建空白的 UWP 项目并将 MainPage.xaml 的内容替换为上述 XAML,然后运行该项目来尝试重现此问题。
考虑到我所做的一切都是更改主题设置,我不明白为什么任何状态触发器都会触发。实际上,根据 MSDN 上的此指南,应该自动重新应用在
当您使用状态触发器时,不需要定义一个空的
而且根据
默认情况下,
这些信息共同强化了我的观点--当我更改主题设置时,窗口宽度并未发生变化,因此我不明白为什么状态触发器会在不应该的情况下触发,而且为什么只有在我调整窗口大小或旋转设备后才会触发状态更改。
那么这是为什么呢?如何解决?
AdaptiveTrigger
适应不同的设备形态。特别地,我有一个基于SplitView
的Shell菜单,具有两种状态触发器,分别在最小窗口宽度为1000 epx和600 epx时触发。在某些移动设备上,根据其形态和比例因素,横向模式下可以触发600 epx状态触发器,这是预期行为。然而,我注意到在桌面上,只要我更改主题设置(如在深色和浅色模式之间切换、更改强调颜色或切换高对比度模式),就会在后台触发600 epx状态触发器(将
ShellSplitView.DisplayMode
从Overlay
更改为CompactOverlay
);在移动模拟器和设备上,在进入“设置”应用程序更改主题设置并返回我的应用程序时也会触发。最奇怪的是,这仅在默认状态下发生,并且只有在我已经触发了任何状态触发器之后才会发生,例如通过调整桌面上的窗口大小或旋转移动模拟器或设备。在返回应用程序后再次调整大小/旋转即可解决问题。我以前没有在任何其他应用程序中看到过这种情况,包括Microsoft的应用程序或任何第三方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 项目并将 MainPage.xaml 的内容替换为上述 XAML,然后运行该项目来尝试重现此问题。
考虑到我所做的一切都是更改主题设置,我不明白为什么任何状态触发器都会触发。实际上,根据 MSDN 上的此指南,应该自动重新应用在
SplitView
元素属性中反映的默认值:当您使用状态触发器时,不需要定义一个空的
DefaultState
。当不再满足状态触发器的条件时,会自动重新应用默认设置。而且根据
Windows.UI.Xaml.AdaptiveTrigger
页面本身的说明:默认情况下,
StackPanel
方向为垂直。当窗口宽度>= 720 个有效像素时,会触发 VisualState
更改,StackPanel
方向会更改为水平。这些信息共同强化了我的观点--当我更改主题设置时,窗口宽度并未发生变化,因此我不明白为什么状态触发器会在不应该的情况下触发,而且为什么只有在我调整窗口大小或旋转设备后才会触发状态更改。
那么这是为什么呢?如何解决?