You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用WinUI 3创建仿Windows设置页按钮并实现NavigationView跳转?

WinUI 3 实现系统设置风格按钮及跨页面导航方案

一、实现图标+标题+描述的设置风格按钮

Windows设置页的条目本质是带自定义内容布局的原生按钮,不需要引入额外第三方库,直接组合内置控件即可实现,自动适配系统明暗主题、高对比度模式,保留原生按钮的所有悬停、点击交互效果。

注意必须给按钮设置HorizontalContentAlignment="Stretch",否则内容不会撑满按钮宽度,和系统样式不符。完整XAML代码如下:

<Button 
    x:Name="EntryNavButton"
    Click="EntryNavButton_Click"
    HorizontalAlignment="Stretch"
    HorizontalContentAlignment="Stretch"
    Padding="12,14,12,14"
    CornerRadius="{StaticResource ControlCornerRadius}">
    <Grid ColumnSpacing="14">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <!-- 左侧功能图标 -->
        <SymbolIcon 
            Grid.Column="0"
            Symbol="Globe"
            FontSize="24"
            Foreground="{ThemeResource SystemControlForegroundAccentBrush}"/>
        <!-- 中部标题+说明文本 -->
        <StackPanel Grid.Column="1" VerticalAlignment="Center" Spacing="4">
            <TextBlock 
                Text="入口名称"
                Style="{StaticResource BodyStrongTextBlockStyle}"
                TextWrapping="WrapWholeWords"/>
            <TextBlock 
                Text="入口的补充描述文本,说明点击后跳转的目标"
                Style="{StaticResource CaptionTextBlockStyle}"
                Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
                TextWrapping="WrapWholeWords"/>
        </StackPanel>
        <!-- 右侧导航指示箭头 -->
        <FontIcon 
            Grid.Column="2"
            FontFamily="{StaticResource SymbolThemeFontFamily}"
            Glyph="&#xE0E3;"
            FontSize="12"
            VerticalAlignment="Center"
            Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"/>
    </Grid>
</Button>

如果需要做跳转网页、启动外部PC应用的入口,直接在按钮点击事件中调用Launcher.LaunchUriAsync(new Uri("目标网址/应用自定义协议"))即可。

二、实现Page4到Page5的NavigationView导航

由于NavigationView控件放在MainPage中,不要直接在Page4中创建新Frame做导航,否则会出现导航栏选中状态不同步、返回栈异常的问题,按以下步骤实现即可:

  • 首先在MainPage.xaml中,给NavigationView和承载页面内容的Frame设置公开访问修饰符,同时给对应Page5的导航菜单项添加匹配标记:
<NavigationView x:Name="RootNavigationView" x:FieldModifier="public">
    <NavigationView.MenuItems>
        <!-- 其他菜单项 -->
        <NavigationViewItem Content="Page5" Tag="Page5">
            <NavigationViewItem.Icon>
                <SymbolIcon Symbol="Document"/>
            </NavigationViewItem.Icon>
        </NavigationViewItem>
    </NavigationView.MenuItems>
    <Frame x:Name="ContentFrame" x:FieldModifier="public" />
</NavigationView>
  • 然后在Page4.xaml.cs的按钮点击事件中,沿可视化树找到父级MainPage实例,调用Frame完成导航,同时同步导航栏选中状态:
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;

private void EntryNavButton_Click(object sender, RoutedEventArgs e)
{
    // 向上遍历可视化树找到MainPage实例
    DependencyObject parent = this;
    while (parent != null && parent is not MainPage)
    {
        parent = VisualTreeHelper.GetParent(parent);
    }

    if (parent is MainPage mainPage)
    {
        // 导航到目标页面
        mainPage.ContentFrame.Navigate(typeof(Page5));
        // 同步导航栏选中状态
        foreach (var item in mainPage.RootNavigationView.MenuItems)
        {
            if (item is NavigationViewItem navItem && navItem.Tag?.ToString() == "Page5")
            {
                mainPage.RootNavigationView.SelectedItem = navItem;
                break;
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者vacyc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:57:08