

Xamarin Forms WPF 干掉默认的窗口导航条
source link: https://lindexi.gitee.io/post/Xamarin-Forms-WPF-%E5%B9%B2%E6%8E%89%E9%BB%98%E8%AE%A4%E7%9A%84%E7%AA%97%E5%8F%A3%E5%AF%BC%E8%88%AA%E6%9D%A1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在创建默认的 Xamarin Forms WPF 应用,将和 UWP 应用的界面不相同,在 WPF 项目会显示顶部蓝色的一条,看起来不好看,那么可以如何干掉他
下图是一个默认的 Xamarin Forms 应用

此时显示工具的蓝色条就是本文说的 窗口导航条,在 Xamarin Forms 的源代码,这个导航条是在 FormsWindow.xaml 文件里面,使用 PART_TopAppBar 控制的,也就是想要不显示这个工具栏,可以通过设置让这个控件不可见
最简单的方法是通过附加属性的方式
在 MainPage.xaml 添加下面代码
NavigationPage.HasNavigationBar="False"
现在的 MainPage.xaml 的代码如下
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Title="工具"
NavigationPage.HasNavigationBar="False"
x:Class="XamarinNeller.MainPage">
<StackLayout>
<Label Text="内容" HorizontalOptions="Center" VerticalOptions="CenterAndExpand"></Label>
</StackLayout>
</ContentPage>
运行代码可以看到如下界面

此时原本显示工具的蓝色的一条就被干掉了
这部分文档请看
xamarin.forms - Remove navigation bar in contentpage Xamarin - Stack Overflow
Navigating in Xamarin Forms - Xamarin Help
那为什么设置 HasNavigationBar 就能干掉工具栏,在 Xamarin Forms 的源代码 FormsWindow.xaml 是通过绑定设置是否显示
<controls:FormsAppBar x:Name="PART_TopAppBar" Visibility="{Binding HasNavigationBar, FallbackValue=Collapsed, TargetNullValue=Collapsed, Converter={StaticResource BoolToVis}, RelativeSource={RelativeSource AncestorType={x:Type controls:FormsWindow}}}"">
<Grid>
<!-- 忽略代码 -->
</Grid>
</controls:FormsAppBar>
而 HasNavigationBar 属性的设置是在 FormsWindow.cs 的 SynchronizeAppBar 方法,在这个方法里面使用这个代码修改
public void SynchronizeAppBar()
{
IEnumerable<FormsPage> childrens = this.FindVisualChildren<FormsPage>();
HasNavigationBar = childrens.FirstOrDefault()?.GetHasNavigationBar() ?? false;
// 忽略代码
}
而 FormsPage 的 GetHasNavigationBar 方法如下
public class FormsPage : UserControl
{
public virtual bool GetHasNavigationBar()
{
return this.HasNavigationBar;
}
}
在 VisualPageRenderer 将会在 UpdateNavigationBarVisible 方法里面设置 FormsPage 的 HasNavigationBar 属性
设置方法是通过获取当前元素的附加属性,使用 NavigationPage.GetHasNavigationBar
的方法获取
所以在 MainPage 设置 NavigationPage.HasNavigationBar="False"
就能让 VisualPageRenderer 也就是对应的布局更新工具栏不可见
在 Xamarin Forms 的 WPF 版本里面,在 WPF 实现了大量基础的控件,和 Xamarin Forms 对应,此时做实际交互和渲染都是原生的 WPF 控件,这样能提升性能
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/Xamarin-Forms-WPF-%E5%B9%B2%E6%8E%89%E9%BB%98%E8%AE%A4%E7%9A%84%E7%AA%97%E5%8F%A3%E5%AF%BC%E8%88%AA%E6%9D%A1.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利
Recommend
-
30
WPF / Windows Forms 检测窗口在哪个屏幕 2020-06-11 10:39 使用 Windows Forms 自带的 System.Windows.Forms.Screen 类可以从一个窗口句柄获取到对应的屏幕...
-
9
WPF 设置 ShowInTaskbar 对窗口最小化的影响在 WPF 中,如果设置了 ShowInTaskbar 为 False 那么窗口将不会在任务栏显示。此时如果设置窗口最小化,那么窗口将会收起来作为没有任务栏时的显示方法 如下面代码 <...
-
8
WPF 稳定的全屏化窗口方法本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法。在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边。本文的方法是基于 Win32...
-
7
WPF将窗口置于桌面下方(可用于动态桌面) 先来看一下效果:
-
6
WPF 使用 SharpDx 渲染博客导航 我写了很多在 WPF 使用 SharpDx 渲染的博客,但是有小伙伴吐槽说这些博客没有一个好看的顺序,我将所有的 SharpDx 的博客按照顺序放在下面 使用 SharpDx 必然会涉及很多底层的渲染知识,和 DirectX 相...
-
5
WPF中的导航框架(一)——概述 有的时候,我们需要一个支持页面跳转的UI,例如文件浏览器,开始向导等。对于这样的界面,...
-
7
WPF 全屏窗口将让 Chrome 97 视频停止播放 无论是使用 WPF 全屏窗口,还是高性能全屏透明窗口,都会在 Chrome 97 以及使用 chromium 对应版本内核的应用的视频停止播放。这是 chromium 的一个优化,因为 chromium 认为,如果有全屏窗口盖在上面,...
-
10
吕毅 发表于 7 小时前 在深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)中,我提到 Dis...
-
5
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于上位机而言,窗口布局有很多种形式,单页面、多页面等等。不过,还有一种分类的方法,大家往往会忽视,那就是针对不同使用者,上位机中界面的开发也要有所区...
-
6
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 这两天在编写代码的时候,正好遇到一个棘手的问题,解决之后感觉挺有意义的,所以先用blog记录一下,后面可以当成经验来参考。问题是这样的,本身软件在加载子窗...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK