You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

UWP应用适配秋季创意者更新:Windows Phone安装运行异常问题

解决UWP NavigationView应用在低版本系统安装后消失的问题

首先得帮你理清一个关键误区: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

火山引擎 最新活动