UWP应用适配秋季创意者更新:Windows Phone安装运行异常问题
首先得帮你理清一个关键误区:Windows 10的版本号和内部版本号对应关系搞混了。你说手机是1709版本,但内部版本10.0.15254其实是Windows 10 1703(Creators Update)的更新版,而Fall Creators Update(也就是NavigationView引入的版本)对应的内部版本是10.0.16299。这就解释了为什么你把最低目标版本设为16299后,应用安装完找不到——系统版本不达标,应用启动时因缺少NavigationView的API直接崩溃,导致系统不把它显示在已安装列表里。
接下来给你两个方向的解决方案:
方案一:升级手机系统到符合要求的版本
如果你的手机支持升级,直接把系统更到10.0.16299或更高版本(也就是真正的1709 Fall Creators Update)。升级后,当前设置的最低目标版本16299就能正常匹配,应用安装后也能正常显示和运行。
方案二:适配低版本系统(保留NavigationView给高版本,低版本用替代控件)
如果无法升级手机系统,你需要降低应用的最低目标版本到15063(1703 Creators Update),同时通过条件XAML和代码判断来兼容两个版本的导航控件:
步骤1:启用条件XAML
打开你的UWP项目文件(.csproj或.vbproj),添加或修改以下配置,确保启用条件XAML并设置正确的版本范围:
<PropertyGroup> <TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion> <!-- 可以选你当前用的目标版本 --> <TargetPlatformMinVersion>10.0.15063.0</TargetPlatformMinVersion> <EnableConditionalXaml>true</EnableConditionalXaml> </PropertyGroup>
步骤2:在XAML中添加条件控件
在页面中同时放置NavigationView和替代的SplitView(低版本常用导航控件),通过视觉状态根据系统版本切换显示:
<Page x:Class="YourAppNamespace.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid> <!-- 高版本用的NavigationView --> <NavigationView x:Name="MainNavView" Visibility="Collapsed" xmlns:contract7="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,7)"> <NavigationView.MenuItems> <NavigationViewItem Content="首页" Icon="Home"/> <NavigationViewItem Content="设置" Icon="Settings"/> </NavigationView.MenuItems> <!-- 页面内容区域 --> <Frame x:Name="ContentFrame"/> </NavigationView> <!-- 低版本用的SplitView --> <SplitView x:Name="MainSplitView" Visibility="Visible" DisplayMode="CompactInline"> <SplitView.Pane> <StackPanel> <Button Content="首页" Style="{StaticResource NavigationViewItemButtonStyle}"/> <Button Content="设置" Style="{StaticResource NavigationViewItemButtonStyle}"/> </StackPanel> </SplitView.Pane> <!-- 页面内容区域 --> <Frame x:Name="SplitContentFrame"/> </SplitView> <!-- 根据系统版本切换控件显示 --> <VisualStateManager.VisualStateGroups> <VisualStateGroup> <VisualState x:Name="UseNavigationView"> <VisualState.StateTriggers> <contract7:ApiContractPresentTrigger ContractName="Windows.Foundation.UniversalApiContract" Version="7"/> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="MainNavView.Visibility" Value="Visible"/> <Setter Target="MainSplitView.Visibility" Value="Collapsed"/> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Grid> </Page>
步骤3:后台代码中做版本判断
在代码里也要根据系统版本初始化对应的导航逻辑,避免调用不存在的API:
using Windows.Foundation.Metadata; public MainPage() { this.InitializeComponent(); if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 7)) { // 初始化NavigationView MainNavView.SelectedItem = MainNavView.MenuItems[0]; MainNavView.ItemInvoked += MainNavView_ItemInvoked; } else { // 初始化SplitView // 这里可以绑定SplitView按钮的点击事件 } } private void MainNavView_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args) { // NavigationView的导航逻辑 switch (args.InvokedItem.ToString()) { case "首页": ContentFrame.Navigate(typeof(HomePage)); break; case "设置": ContentFrame.Navigate(typeof(SettingsPage)); break; } }
这样设置后,应用在16299及以上系统会显示NavigationView,在更低版本会显示SplitView,同时不会出现安装后消失的问题。
内容的提问来源于stack exchange,提问作者RandomB




