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调用它?如果你使用
self
。你真的是说仅仅将作为self
添加到三行代码中就会导致错误吗?那听起来不可能,就是这样,查尔斯。在“内容页”中添加“Sube”,红色会出现错误,也会出现错误。如果您使用self
。你真的是说仅仅将作为self
添加到三行代码中就会导致错误吗?那听起来不可能,就是这样,查尔斯。添加“self”会使ContentPage下的红色扭曲,出现错误。