Xamarin.Forms 多界面显示

2024-04-24 09:08
文章标签 xamarin 界面显示 forms

本文主要是介绍Xamarin.Forms 多界面显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下主要内容转自: 

https://developer.xamarin.com/zh-cn/guides/xamarin-forms/getting-started/hello-xamarin-forms-multiscreen/quickstart/

http://www.jianshu.com/p/d774921d1014

 

多界面示例(参考微软官方教程实现):

1.参考“建立第一个App”创建一个工程

2.新建一个“Forms Xaml 页面”类型文件“CallHistoryPage”,

3.在 CallHistoryPage.xaml 中,添加如下代码

  <ContentPage.Padding><OnPlatform x:TypeArguments="Thickness"iOS="20, 40, 20, 20"Android="20, 20, 20, 20"WinPhone="20, 20, 20, 20" /></ContentPage.Padding><Label x:Name="lb" Text="第二个界面" />

4.在 App.xaml.cs 中初始化 App 构造函数中的属性,并将 MainPage 属性初始化为 NavigationPage。

    MainPage = new NavigationPage(new MainPage());

5.在 MainPage.xaml 中,在 StackLayout 控件末尾处添加 Button 控件。 此按钮用于导航到呼叫历史记录页:

  <StackLayout VerticalOptions="FillAndExpand"HorizontalOptions="FillAndExpand"Orientation="Vertical"Spacing="15"><Button x:Name="callHistoryButton" Text="Call History" Clicked="OnCallHistory" /></StackLayout>

6.在 MainPage.xaml.cs 中,添加 如下代码

        public MainPage(){InitializeComponent();callHistoryButton.Clicked += (s,e) =>{OnCallHistory(s,e);};}async void OnCallHistory(object sender, EventArgs e){await Navigation.PushAsync(new CallHistoryPage());}

运行效果如下:

        

多界面的相关知识

Xamarin.Forms 提供了内置导航模型,用于管理页面堆栈的导航和用户体验。 此模型实现了 Page 对象的后进先出 (LIFO) 堆栈。 若要从一个页面移动到另一个页面,应用程序会将新页面推送到此堆栈上。 若要返回上一页,应用程序将从堆栈弹出当前页。

Xamarin.Forms 具有 NavigationPage 类,用于管理 Page 对象的堆栈。 NavigationPage 类还会将导航栏添加到页面顶部,此页面显示标题和平台相应的“返回”按钮,通过此按钮可返回上一页。

每个应用程序都有一个特殊页作为应用程序的入口(main page, or the home page, or the start page),Xamarin.Forms中由App的MainPage属性设置。

以下代码示例演示如何围绕应用程序的第一页包装 NavigationPage:

public App ()
{//...MainPage = new NavigationPage (new MainPage());
}

所有 ContentPage 实例都具有 Navigation 属性,可提供修改页面堆栈的方法。 应仅当应用程序包括 NavigationPage 时,才调用这些方法。 若要导航到 CallHistoryPage,则必须调用 PushAsync 方法,如下面的代码示例中所示:

async void OnCallHistory(object sender, EventArgs e)
{await Navigation.PushAsync (new CallHistoryPage());
}

这将导致新的 CallHistoryPage 对象推送到导航堆栈上。 若要以编程方式返回原始页,CallHistoryPage 对象必须调用 PopAsync 方法,如下面的代码示例中所示:

await Navigation.PopAsync();

但是,在 本应用程序中无需此代码,因为 NavigationPage 类将导航栏添加到页面顶部,此页面包括平台相应的“返回”按钮,通过此按钮可返回上一页。

INavigation介绍

下面这段还不太理解。

Xamarin.Forms中页面分为Modal pages(模态页面) 和 modeless pages(非模态页面),跳转到一个新的页面可以通过PushAsync和PushModalAsync两个方法实现,两个方法均传入一个Page对象作为参数。同样提供了PopAsync和PopModalAsync两个方法返回前一个页面。PushAsync和PopAsync是对非模态页面的操作,PushModalAsync和PopModalAsync操作的是模态页面。PopToRootAsync方法表示回到导航栈低页面。RemovePage方法从导航栈中删除一个页面。InserPageBefore方法将一个page插入到指定page之前。通过这些方法操作Navigation Stack可以在不同Page间跳转。

 

INavigation还定义了两个IReadOnlyList<Page>类型属性ModalStack和NavigationStack,NavigationStack表示非模态页面的集合,PushAsync和PopAsync会改变NavigationStack的内容,ModalStack表示模态页面的集合PushModalAsync和PopModalAsync会改变ModalStack的内容,这两个属性不能直接修改,且提供了类似堆栈的功能。这两个集合不能混合跳转,非模态页面可以导航到模态页面但是模态页面不能导航到非模态页面。

如果用MainPage = new NavigationPage(new Page0());初始化App的MainPage属性运行应用程序,此时IOS平台中ModalStack为空,Android和Windows平台ModalStack包含一个元素(MainPage对应

NavigationPage实例)。三个平台中的NavigationStack集合包均含一个Page0的实例。

这些方法均定义在INavigation中,VisualElement提供了一个INavigation类型只读属性Navigation,可以通过调用Navigation的方法实现跳转。

页面中调用代码Navigation.PushAsync(new ModelessPage(), true);

 

NavigationPage提供的属性

BarBackgroundColor - 获取、设置NavigationPage顶部导航栏的背景色(iOS、Android、Windows 平台有效)。

BarTextColor - 获取、设置NavigationPage顶部导航栏显示文本颜色(iOS、Windows平台有效)。

CurrentPage - 获取Navigation Stack最顶部页面,不管当前显示页面是模态页面还是非模态页面,CurrentPage都表示NavigationStack集合中的最后一项。

不同平台效果:

 

NavigationPage提供的BindableProperty

HasBackButtonProperty - 是否显示非模态页面导航栏的返回按钮(iOS、Android起作用)

C#设置NavigationPage.SetHasBackButton(this, false);

XAML设置NavigationPage.HasBackButton="False"

HasNavigationBarProperty - 是否显示导航栏

BackButtonTitleProperty - 设置返回按钮的文本(仅iOS平台)

TitleIconProperty - 设置导航栏上显示图标(iOS平台Icon代替Title,Android修改左侧图标显示,Windows 无效)

 

屏蔽Android、Windows Mobile 返回按键

感觉用不到,具体见原文。

 

页面间传值

 

1.构造函数传值

页面跳转的PushXXX方法传入Page页面实例作为参数,可以通过Page页面的构造函数传入数据,如Navigation.PushModalAsync(new DataPage(label.Text));,在DataPage重载的构造函数中在处理接收的数据。

2.属性方法传值

根据页面的属性或调用方法传值。如:

构造函数传值是单向的不能传递返回数据,通过属性传值可以从当前页面向前一个页面传值。应从NavigationStack集合中取得前一个页面实例。

从模态页面跳转到非模态页面和模态页面跳转到模态页面两种情况,跳转前的页面在NavigationStack中有不同的位置。如果是非模态页面跳转到非模态页面?又要从ModalStack中获取前一个页面实例,所以通过属性和方法传值不推荐!!!

3.Messaging Center传值

MessagingCenter是一个静态类,提供了Subscribe、Unsubscribe和Send三个公开的方法。Subscribe订阅接收的消息信息,参数、发送者类型等。Unsubscribe取消订阅,不在接收消息。Send发送指定类型消息。有点像Android中广播发送和接收方式。

使用方法见原文。

4.App Class传值

Xamarin.Forms应用程序会提供一个App类(继承Application)作为程序的入口,该对象在应用程序运行期间一直存在,可以借助App类实现不同页面之间数据传递。

修改App代码定义属性保存、获取数据。如:

获取App类实例可以通过(App)Application.Current)获取。或着直接定义static 属性,直接通过App.Value 传值。

或者自己定义一个中间类进行传值。

5.事件传值

WinForm中常用的传值形式,事件传值。推荐数据回传时使用。

用法见原文。

这篇关于Xamarin.Forms 多界面显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931329

相关文章

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误,这给本地调试造成了极大的不便,在被这个问题困扰了多日以后,终于在GitHub上找到答案 基于这个 帖子 ,有一个回复 他写了一个帮助类,专门用来调试本地的API,并给出了这个调用类的用法,此帮助类如下 using System.Net.Security;public class DevHttpsConnectionHelper{pu

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

Xamarin.IOS 加载base64的图片

byte[] encodedDataAsBytes = System.Convert.FromBase64String (imageToDisplay);NSData data = NSData.FromArray (encodedDataAsBytes);return UIImage.LoadFromData (data);

Xamarin 画圆

Oval Drawing   画园 var ovalPath = UIBezierPath.FromOval(new CGRect(51.0f, 66.0f, 37.0f, 36.0f)); UIColor.Gray.SetFill(); ovalPath.Fill(); Star Drawing  画星星 UIBezierPath starPath = new UIBe

Xamarin.Forms 判断颜色亮度

Color ColorToContrastColor(Color color)         {             // Standard luminance calculation.                          double luminance = 0.30 * color.R + 0.59 * color.G + 0.11 * color.B;

Xamarin.ios 解决new NSUrl 返回为空的方法。

var uri = new Uri (urlString);var nsurl = new NSUrl (uri.GetComponents (UriComponents.HttpRequestUrl, UriFormat.UriEscaped));UIApplication.SharedApplication.OpenUrl (nsurl);

Xamarin.Android set no title and no icon

ActionBar.SetIcon(Android.Resource.Color.Transparent); ActionBar.SetDisplayShowTitleEnabled(false);

Xamarin.iOS使用Objective-C静态类库.a(Linking Native Libraries)

Xamarin静态类库的binding实际上是一个C#与Objective-C方法间映射过程,由于第三方SDK对iOS开发至关重要,因此官方文档中也对这块也做了完整的介绍(Binding Objective-C Libraries),但对于一个完全入门级的程序员来说,这块还是有诸多麻烦,并且部分Api类型文档上也未曾提到。下面将以百度地图作为案例,全面解析静态类库binding工程的知识与问题

STM32实现多级菜单界面显示

1、main函数中,while循环之前 MenuStruct menu[30]= //定义多级菜单结构体数组{{0,0,0,1,show0}, //第一个元素表示索引号,第二个元素表示该按键按下后要返回的界面,第三个元素表示该按键按下后要切换的菜单条目界面,第四个元素表示该按键按下后要进入的界面{1,0,2,4,show1},{2,0,3,5,show2}, {3,0,1,6,show

CorelDraw安装时界面显示不全的解决方案

问题原因:安装包权限 解决方案: 1、安装包解压后,找到Setup文件,复制粘贴到当前文件夹并重命名为Getup后,右击Getup文件,选择“以管理员身份运行” 说明:除了命名Gsetup。还可以命名为其他的,例如setup32,setup64等。