我创建了一个这样的主页面:
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 回答
使用自我标识符:
我怀疑这是由于F#方法被转换为静态方法(至少这是我的理解) . 静态方法无法访问基类型的方法 .
如果您按如下方式定义
onButtonClicked
,它应该适合您使用
member this.onButtonClicked
语法创建一个类方法,而不是类上的静态方法 . 然后,您可以按预期访问类上的this.Navigation
.至于构造函数排序的问题,有两种解决方案:
此链接应解释如何在构造函数中执行此操作:https://fsharpforfunandprofit.com/posts/classes/#accessing-the-instance-via-this-in-a-do-block
但是,根据那篇文章,这是不好的做法,另一种方法是在页面的
OnStart
或PageAppearing
生命周期方法中分配处理程序 .