F#:如何在Xamarin.Forms中的页面之间导航

时间:2018-07-09 00:32:15

标签: xamarin.forms f#

我创建了这样的主页:

Ext.grid.Grid

我将Content页面包装在App.xaml.fs中,如下所示:

Ext.create('Ext.grid.Grid', {
    columns: [{
        width: 200,
        dataIndex: 'firstName',
        flex: 1,
        text: 'First Name'
    }, {
        width: 200,
        dataIndex: 'lastName',
        flex: 1,
        text: 'Last Name'
    }],
    renderTo: Ext.getBody()
});

但是,它不会编译。我明白了:

  

/Users/jamesdixon/Projects/foo/foo/MainPage.xaml.fs(9,9):   错误FS0039:值,名称空间,类型或模块“ Navigation”不是   定义。也许您需要以下之一:NavigationPage
  navigatonGrid navigatonButton navigatonImage
  NavigationEventArgs(FS0039)(foo.Mobile.iOS)

但是,由于出现此错误,我无法添加“ this”关键字:

  

/Users/jamesdixon/Projects/foo/foo.Mobile/MainPage.xaml.fs(9,9):   错误FS0039:值,名称空间,类型或模块“ this”不是   定义。也许您需要以下之一:ThisAssembly(FS0039)   (SameRoom.foo.iOS)

按钮单击不能是静态的问题吗?如果是这样,事件处理程序的正确语法是什么?

更新:根据以下评论,我尝试了此操作:

namespace Foo

open System
open Xamarin.Forms
open Xamarin.Forms.Xaml

type MainPage() =
    inherit ContentPage()
    let _ = base.LoadFromXaml(typeof<MainPage>)
    let baseLayout = base.Content :?> AbsoluteLayout
    let backgroundImage = baseLayout.Children.[0] :?> Image
    let navigatonGrid = baseLayout.Children.[1] :?> Grid
    let navigatonImage = navigatonGrid.Children.[0] :?> Image
    let navigatonButton = navigatonGrid.Children.[1] :?> Button

    let onButtonClicked sender args =
        let loginPage = new NavigationPage(FacebookLoginPage())
        Navigation.PushAsync(loginPage) |> ignore


    let populateImages =
        backgroundImage.Source <- ImageSource.FromResource("foo.jpg")
        navigatonImage.Source <- ImageSource.FromResource("bar.jpg")

    do
        populateImages
        navigatonButton.Clicked.AddHandler(new EventHandler(onButtonClicked))

但是现在我得到了

  

未定义类型'ContentPage'

2 个答案:

答案 0 :(得分:3)

使用自我识别符:

type MainPage() as this =

答案 1 :(得分:2)

我怀疑这是由于F#方法被转换为静态方法(至少这是我的理解)。静态方法无权访问基本类型的方法。

如果您按以下方式定义onButtonClicked,那么它应该对您有用

member this.onButtonClicked sender args =
    let loginPage = new NavigationPage(FacebookLoginPage())
    this.Navigation.PushAsync(loginPage) |> ignore

使用member this.onButtonClicked语法创建一个类方法,而不是在该类上的静态方法。然后,您可以按预期访问班级上的this.Navigation

关于构造函数排序的问题,有两种解决方案:

此链接应说明如何在构造函数中执行此操作: https://fsharpforfunandprofit.com/posts/classes/#accessing-the-instance-via-this-in-a-do-block

但是,根据该文章,这是不好的做法,另一种选择是在页面的OnStartPageAppearing生命周期方法中分配处理程序。