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 多界面显示        Xamarin.Forms 多界面显示

多界面的相关知识

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的实例。

Xamarin.Forms 多界面显示

这些方法均定义在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集合中的最后一项。

不同平台效果:

Xamarin.Forms 多界面显示

 

NavigationPage提供的BindableProperty

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

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

XAML设置NavigationPage.HasBackButton="False"

HasNavigationBarProperty - 是否显示导航栏

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

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

Xamarin.Forms 多界面显示

 

屏蔽Android、Windows Mobile 返回按键

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

 

页面间传值

 

1.构造函数传值

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

2.属性方法传值

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

Xamarin.Forms 多界面显示

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

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

3.Messaging Center传值

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

使用方法见原文。

4.App Class传值

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

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

Xamarin.Forms 多界面显示

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

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

5.事件传值

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

用法见原文。

上一篇:win10 uwp 使用 XamlTreeDump 获取 XAML 树元素内容


下一篇:Xamarine ContentPage.ToolbarItems 未显示/不显示在界面