Xamarin.Forms AppShell如何设置Flyout从导航栏下方滑出
Xamarin.Forms AppShell 非覆盖式Flyout实现方案
原生Xamarin.Forms AppShell没有提供开箱即用的配置项来让Flyout默认从导航栏下方弹出,不过可以通过以下两种基于AppShell原生能力的方案实现需求,不需要完全重写Flyout视图:
方案一:自定义导航栏+Flyout边距配置(无自定义渲染器,优先推荐)
该方案改动最小,不需要处理平台差异逻辑:
- 全局关闭AppShell自带的默认导航栏:在AppShell的XAML根节点添加属性
Shell.NavBarIsVisible="False" - 封装一个独立的自定义导航栏组件,高度和各平台默认导航栏对齐(iOS为44、Android为56、UWP为48),将该组件固定在应用最顶层,或者嵌入到每个内容页的顶部
- 在AppShell的XAML根节点配置Flyout顶部边距:
FlyoutMargin="0, {x:Static OnPlatform Android=56, iOS=44, UWP=48}, 0, 0",让Flyout弹出时正好从导航栏下方开始显示 - 自定义导航栏的汉堡按钮直接绑定
Shell.Current.FlyoutIsPresented属性即可控制Flyout的开关,导航栏其他按钮的交互逻辑完全不受Flyout影响
方案二:自定义Shell渲染器(保留系统默认导航栏)
如果不想自己实现导航栏,可以通过各平台的自定义Shell渲染器修改Flyout的容器布局:
- Android端:自定义继承自
ShellRenderer的渲染类,找到Flyout的容器控件,修改其TopMargin为系统导航栏高度,同时调整Flyout的弹出动画起始位置 - iOS端:自定义继承自
ShellRenderer的渲染类,修改对应UISplitViewController的Flyout视图Frame,将Y值设置为导航栏高度,同时限制Flyout的交互范围不覆盖导航栏区域
注意
你之前尝试的HeightRequest、空白头部方案不生效的原因是:Flyout的根容器默认是全屏大小,HeightRequest仅能限制Flyout内容的高度,不会修改容器的顶部位置;空白头部只会让Flyout内容下移,但是全屏容器仍然会拦截导航栏的点击事件。
内容的提问来源于stack exchange,提问作者Muffin Man
相关产品推荐
相关产品推荐

