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

F#:如何在Xamarin.Forms中的页面之间导航,xamarin.forms,f#,Xamarin.forms,F#,我创建了如下主页: 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 backgro

我创建了如下主页:

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))
namespace foo

open Xamarin.Forms

type App() =
    inherit Application(MainPage = NavigationPage(MainPage()))
但是,它不编译。我明白了:

/Users/jamesdixon/Projects/foo/foo/MainPage.xaml.fs(9,9): 错误FS0039:值、命名空间、类型或模块“导航”不正确 定义可能您需要以下选项之一:导航页面
导航栅格导航按钮导航图像
NavigationEventArgs(FS0039)(foo.Mobile.iOS)

但是,我无法添加“this”关键字,因为我遇到以下错误:

/Users/jamesdixon/Projects/foo/foo.Mobile/MainPage.xaml.fs(9,9): 错误FS0039:值、命名空间、类型或模块“this”不正确 定义可能您需要以下选项之一:此程序集(FS0039) (SameRoom.foo.iOS)

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

更新:基于以下评论,我尝试了以下方法:

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

type MainPage(x) as self =
    inherit ContentPage()
    let _ = base.LoadFromXaml(typeof<MainPage>)
开放系统
打开Xamarin.Forms
打开Xamarin.Forms.Xaml
将主页(x)键入为self=
继承ContentPage()
让u=base.LoadFromXaml(typeof)
但现在我明白了

未定义类型“ContentPage”


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

如果您按以下方式定义
onButtonClicked
,它应该适合您

member this.onButtonClicked sender args =
    let loginPage = new NavigationPage(FacebookLoginPage())
    this.Navigation.PushAsync(loginPage) |> ignore
使用
成员this.onButtonClicked
语法创建类方法,而不是类上的静态方法。然后,您可以按预期访问类上的
This.Navigation

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

此链接应说明如何在构造函数中执行此操作:


但是,根据那篇文章,这是一种不好的做法,另一种做法是在页面的
OnStart
pageappeating
生命周期方法中分配处理程序

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

如果您按以下方式定义
onButtonClicked
,它应该适合您

member this.onButtonClicked sender args =
    let loginPage = new NavigationPage(FacebookLoginPage())
    this.Navigation.PushAsync(loginPage) |> ignore
使用
成员this.onButtonClicked
语法创建类方法,而不是类上的静态方法。然后,您可以按预期访问类上的
This.Navigation

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

此链接应说明如何在构造函数中执行此操作:

但是,根据那篇文章,这是一种不好的做法,另一种做法是在页面的
OnStart
pageappeating
生命周期方法中分配处理程序

使用自标识符:

type MainPage() as this =
使用自标识符:

type MainPage() as this =

如果将事件处理程序设置为类方法,则必须将其放在do命令下面,这意味着addHandler函数无法找到它。那我该把它放在哪里呢?将其设为成员并从.ctor调用?如果将事件处理程序设为类方法,则必须将其置于do命令下方,这意味着addHandler函数无法找到它。那我该把它放在哪里呢?把这个成员从C.Tor调用它?如果你使用这个< /COD>用于成员声明,你可能需要考虑一个不同的自标识符名称,比如“代码>自我>代码>,以明确你所做的事情。感谢您花时间澄清这一点。这不起作用-请参阅原始问题中的我的更新。您现在可以访问self.Navigation(正如您在问题中暗示的那样,正如泰勒的回答所阐明的那样)。我不明白你的问题,因为你的示例代码没有使用标识符
self
。你真的是说仅仅将
作为self
添加到三行代码中就会导致错误吗?那听起来不可能,就是这样,查尔斯。在“内容页”中添加“Sube”,红色会出现错误,也会出现错误。如果您使用这个< /代码>成员声明,您可能需要考虑一个不同的自标识符名称,例如“代码>自我>代码>,以明确您所做的。感谢您花时间澄清这一点。这不起作用-请参阅原始问题中的我的更新。您现在可以访问self.Navigation(正如您在问题中暗示的那样,正如泰勒的回答所阐明的那样)。我不明白你的问题,因为你的示例代码没有使用标识符
self
。你真的是说仅仅将
作为self
添加到三行代码中就会导致错误吗?那听起来不可能,就是这样,查尔斯。添加“self”会使ContentPage下的红色扭曲,出现错误。