[英]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.