我试图将这个C# (WPF )代码转换为F#/FsXaml,以便将WPF窗口最小化。
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = DependencyInjector.Retrieve<MainWindowViewModel>();
}
//... some generated code
private void OnKeyDownHandler(object sender, System.Windows.Input.KeyEventArgs e)
=> this.WindowState = (e.Key == Key.Escape) ? (WindowState)FormWindowState.Minimized : (WindowState)FormWindowState.Normal;
}如何将带有OnKeyDownHandler的C#代码转换为F#/FsXaml (只有后面的代码,没有OnKeyDownHandler)?
我确实试图在F#/FsXaml中创建等效的代码,但没有成功-请参见下面。
open System.Windows.Input
type MainWindowXaml = FsXaml.XAML<"XAMLAndCodeBehind/MainWindow.xaml">
type MainWindow() as this =
inherit MainWindowXaml()
//... some code
let MyOnKeyDownHandler (e: System.Windows.Input.KeyEventArgs) =
match (e.Key = Key.Escape) with
| true -> this.WindowState <- Windows.WindowState.Minimized
| false -> this.WindowState <- Windows.WindowState.Normal
do
this.KeyDown.Add MyOnKeyDownHandler 类型为MainWindow()的行给出了以下两个错误:
“MainWindowXaml.OnKeyDownHandler(发件人: obj,e: KeyEventArgs):unit”没有实现
这种类型是“抽象的”,因为有些抽象成员没有得到实现。如果这是有意的,那么将'[]‘属性添加到您的类型。
相关的xaml文件(在C#中以及在我的F#尝试中)都在DataContext部分中包含KeyDown="OnKeyDownHandler“。
编辑:添加了XAML文件的相关部分:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Icon= ......
KeyDown="OnKeyDownHandler"
WindowStartupLocation="CenterScreen"
Title="...">
<Canvas Margin="0,0,2,2">
//... some XAML code...
</Canvas>
</Window>发布于 2021-11-29 11:59:31
我没有直接使用FsXaml的经验,但您所使用的模式似乎与WpfSimpleMvvmApplication示例中的模式相似。在这里,xaml文件定义了一个事件处理程序OnFullNameDoubleClick。然后,这将成为生成类中的一个抽象方法,需要在相应的F#源文件中覆盖。
这意味着您的OnKeyDownHandler (大概是在XAML文件中定义的,但问题中没有包含)需要定义为overriden方法(并且FsXaml会自动附加事件处理程序):
open System.Windows.Input
type MainWindowXaml = FsXaml.XAML<"XAMLAndCodeBehind/MainWindow.xaml">
type MainWindow() =
inherit MainWindowXaml()
//... some code
override this.OnKeyDownHandler(_:obj, e: System.Windows.Input.KeyEventArgs) =
match (e.Key = Key.Escape) with
| true -> this.WindowState <- Windows.WindowState.Minimized
| false -> this.WindowState <- Windows.WindowState.Normal编辑:我还从类定义中删除了as this,因为这不再需要了--您可以通过方法定义访问this (这有点简单)。
https://stackoverflow.com/questions/70149069
复制相似问题