FsXaml中将C#实现WPF窗口最小化的代码转换为F#的问题
报错原因
- 你在XAML的Window节点显式配置了
KeyDown="OnKeyDownHandler"属性,FsXaml解析XAML时会自动在生成的MainWindowXaml基类中声明一个签名为OnKeyDownHandler(sender: obj, e: KeyEventArgs) : unit的抽象方法,要求子类必须实现 - 你自行定义的
MyOnKeyDownHandler方法名称、签名都不符合基类要求,同时你额外通过KeyDown.Add绑定事件属于重复操作,因此触发抽象成员未实现的报错
解决方案(二选一即可)
方案1:保留XAML中的事件绑定,直接实现基类要求的方法
直接实现OnKeyDownHandler重写方法,无需手动绑定事件:
open System.Windows open System.Windows.Input type MainWindowXaml = FsXaml.XAML<"XAMLAndCodeBehind/MainWindow.xaml"> type MainWindow() as this = inherit MainWindowXaml() // 重写基类要求的事件处理方法 override this.OnKeyDownHandler(sender: obj, e: KeyEventArgs) = this.WindowState <- if e.Key = Key.Escape then WindowState.Minimized else WindowState.Normal
该方案对应你原有C#的实现逻辑,和C#版本的行为完全一致。
方案2:删除XAML中的事件绑定,用F#风格手动绑定事件
先删掉XAML Window节点中的KeyDown="OnKeyDownHandler"属性,再使用你原来的手动绑定逻辑即可,没有抽象成员要求:
open System.Windows open System.Windows.Input type MainWindowXaml = FsXaml.XAML<"XAMLAndCodeBehind/MainWindow.xaml"> type MainWindow() as this = inherit MainWindowXaml() let onKeyDownHandler (e: KeyEventArgs) = this.WindowState <- if e.Key = Key.Escape then WindowState.Minimized else WindowState.Normal do this.KeyDown.Add onKeyDownHandler
额外说明
你原有C#代码中引用了System.Windows.Forms的FormWindowState枚举属于多余依赖,WPF本身在System.Windows命名空间下就提供了原生的WindowState枚举,直接使用即可,无需引入WinForms程序集。
内容的提问来源于stack exchange,提问作者Miroslav Husťák
相关产品推荐
相关产品推荐

