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

如何在UWP中同一位置组合使用Flyout与MenuFlyout

问题原因

UWP/WinUI 中 Button.Flyout 是单一依赖属性,仅支持赋值一个 FlyoutBase 派生类实例,你同时为其设置两个Flyout对象时,仅最后定义的MenuFlyout会生效,所以无法达到预期效果。

解决方案

场景1:同一个弹出层同时包含自定义内容+菜单

如果你需要弹出层顶部放自定义内容、下方接菜单选项,直接复用MenuFlyout的Header属性承载自定义内容即可,完整代码如下:

<Button Width="24" Height="24" Padding="0" HorizontalAlignment="Right" CornerRadius="12" BorderThickness="0">
    <Image Source="/Assets/UserLogo.png"/>
    <Button.Flyout>
        <MenuFlyout Placement="BottomEdgeAlignedRight">
            <!-- 此处替换为你原来Flyout中的自定义内容 -->
            <MenuFlyout.Header>
                <StackPanel Padding="12,8">
                    <TextBlock Text="Sample"/>
                    <!-- 可继续添加头像、用户名等需要的自定义控件 -->
                </StackPanel>
            </MenuFlyout.Header>
            <MenuFlyout.Items>
                <MenuFlyoutSubItem Text="Add" Icon="Add" Tag="left">
                    <MenuFlyoutItem Text="New repository"/>
                    <MenuFlyoutItem Text="Import repository"/>
                    <MenuFlyoutItem Text="New gist"/>
                    <MenuFlyoutItem Text="New organization"/>
                    <MenuFlyoutItem Text="New project"/>
                </MenuFlyoutSubItem>
                <MenuFlyoutItem Text="Your profile"/>
                <MenuFlyoutItem Text="Your repository"/>
                <MenuFlyoutItem Text="Your codespaces"/>
                <MenuFlyoutItem Text="Your projects"/>
                <MenuFlyoutItem Text="Your stars"/>
                <MenuFlyoutItem Text="Your gists"/>
                <MenuFlyoutSeparator/>
                <MenuFlyoutItem Text="Settings" Icon="Setting" Tag="right"/>
                <MenuFlyoutSeparator/>
                <MenuFlyoutItem Text="Sign out" Tag="right"/>
            </MenuFlyout.Items>
        </MenuFlyout>
    </Button.Flyout>
</Button>

场景2:不同交互触发不同Flyout

如果你需要左键点击弹出普通Flyout、右键点击弹出菜单Flyout,可以将两个Flyout放到按钮资源中,手动处理对应事件控制弹出:

<Button Width="24" Height="24" Padding="0" HorizontalAlignment="Right" CornerRadius="12" BorderThickness="0" 
        Click="Button_OnClick" RightTapped="Button_OnRightTapped">
    <Image Source="/Assets/UserLogo.png"/>
    <Button.Resources>
        <Flyout x:Key="CustomFlyout">
            <StackPanel>
                <TextBlock Text="Sample"/>
            </StackPanel>
        </Flyout>
        <MenuFlyout x:Key="UserMenuFlyout" Placement="BottomEdgeAlignedRight">
            <MenuFlyout.Items>
                <!-- 菜单项内容和之前保持一致,此处省略 -->
            </MenuFlyout.Items>
        </MenuFlyout>
    </Button.Resources>
</Button>

后台事件逻辑:

private void Button_OnClick(object sender, RoutedEventArgs e)
{
    var customFlyout = (Flyout)((Button)sender).Resources["CustomFlyout"];
    customFlyout.ShowAt((Button)sender);
}

private void Button_OnRightTapped(object sender, RightTappedRoutedEventArgs e)
{
    var menuFlyout = (MenuFlyout)((Button)sender).Resources["UserMenuFlyout"];
    menuFlyout.ShowAt((Button)sender, e.GetPosition((Button)sender));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:00