我创建了这样的主页:
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'
答案 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
但是,根据该文章,这是不好的做法,另一种选择是在页面的OnStart
或PageAppearing
生命周期方法中分配处理程序。