首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小化FsXaml中的WPF窗口

最小化FsXaml中的WPF窗口
EN

Stack Overflow用户
提问于 2021-11-29 02:05:00
回答 1查看 73关注 0票数 0

我试图将这个C# (WPF )代码转换为F#/FsXaml,以便将WPF窗口最小化。

代码语言:javascript
复制
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中创建等效的代码,但没有成功-请参见下面。

代码语言:javascript
复制
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文件的相关部分:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 11:59:31

我没有直接使用FsXaml的经验,但您所使用的模式似乎与WpfSimpleMvvmApplication示例中的模式相似。在这里,xaml文件定义了一个事件处理程序OnFullNameDoubleClick。然后,这将成为生成类中的一个抽象方法,需要在相应的F#源文件中覆盖。

这意味着您的OnKeyDownHandler (大概是在XAML文件中定义的,但问题中没有包含)需要定义为overriden方法(并且FsXaml会自动附加事件处理程序):

代码语言:javascript
复制
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 (这有点简单)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70149069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档