首页 文章

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

提问于
浏览
1

我创建了一个这样的主页面:

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

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

namespace foo

open Xamarin.Forms

type App() =
    inherit Application(MainPage = NavigationPage(MainPage()))

但是,它没有编译 . 我明白了:

/Users/jamesdixon/Projects/foo/foo/MainPage.xaml.fs(9,9):错误FS0039:未定义值,命名空间,类型或模块“导航” . 也许你想要以下之一: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)

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

更新:根据以下评论,我尝试了这个:

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

type MainPage(x) as self =
    inherit ContentPage()
    let _ = base.LoadFromXaml(typeof<MainPage>)

但现在我明白了

未定义“ContentPage”类型

2 回答

  • 4

    使用自我标识符:

    type MainPage() as this =
    
  • 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 生命周期方法中分配处理程序 .

相关问题