繁体   English   中英

WPF和F#背后的代码

[英]Code behind WPF and F#

是否可以在F#中创建使用WPF并带有经典代码的应用程序? 我知道它可以与MVVM完美配合,并且没有任何代码,但是我需要在UserControl上实现一个接口。 F#有可能吗?

有点帮助,这是我想从C#转换为F#的代码

public class Test : UserControl, IContent {

    public void InitializeComponents() {
        // Do the initialization magic
    }

    public Test() {
    }

    public void OnFragmentNavigation(FragmentNavigationEventArgs e) {
        this.DataContext = new { description = "Hallo Welt :)" };
    }

    public void OnNavigatedFrom(NavigationEventArgs e) {
    }

    public void OnNavigatedTo(NavigationEventArgs e){
    }

    public void OnNavigatingFrom(NavigatingCancelEventArgs e) {
    }
}

这是标记

<UserControl xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="Test">
    <TextBlock Text="{Binding description}"></TextBlock>
</UserControl>

这实际上取决于您所说的“背后的经典代码”的含义。 正如Petr所提到的,F#没有部分类(并且也没有编辑器支持),所以您将不会获得相同的体验(当您访问元素或添加事件时)。 但是您当然可以构建使用相同编程模型的WPF应用程序。

获得与标准代码非常接近的内容的一种方法是定义一个与每个xaml文件相关联的类,该类看起来像这样:

type SomeComponent() =
  let uri = System.Uri("/AppName;component/SomeComponent.xaml", UriKind.Relative)
  let ctl = Application.LoadComponent(uri) :?> UserControl

  let (?) (this : Control) (prop : string) : 'T =
    this.FindName(prop) :?> 'T

  let okBtn : Button  = ctl?OkButton
  do okBtn.Click.Add(fun _ -> (* .. whatever *) )

这将加载XAML内容,然后使用动态查找运算符查找所有UI元素(您将在C#中免费获得)。 更好的F#解决方案是使用FsXaml ,它具有XAML类型的提供程序(但遗憾的是,没有太多的文档)。

可能没有。 据我所知,F#不支持局部类。

但是您可以按照以下说明使用F#XAML类型提供程序: http : //www.mindscapehq.com/blog/index.php/2012/04/29/using-wpf-elements-from-f/

我找到了一个解决方案,我只是简单地说一下,这是代码:

namespace Testns

open System.Windows.Controls
open FirstFloor.ModernUI.Windows
open Microsoft.FSharp.Core
open System

type TestUserControl() =
    inherit UserControl()

    interface IContent with
        member x.OnFragmentNavigation(e: Navigation.FragmentNavigationEventArgs): unit = 
            let vm = ViewModel("Hallo Welt :)")
            base.DataContext <- vm
            ()

        member x.OnNavigatedFrom(e: Navigation.NavigationEventArgs): unit = ()

        member x.OnNavigatedTo(e: Navigation.NavigationEventArgs): unit = ()

        member x.OnNavigatingFrom(e: Navigation.NavigatingCancelEventArgs): unit = ()

和标记

<local:TestUserControl xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Testns;assembly=App">
    <TextBlock Text="{Binding description}"></TextBlock>
</local:TestUserControl>

这不是实际问题的答案,仅适用于我的用例。 因此,请随时回答:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM