使用F#创建WPF应用程序指南
创建F# WPF代码隐藏应用程序
首先创建一个F#控制台应用程序(.NET Framework)。
将应用程序的输出类型更改为*Windows应用程序*。
添加FsXaml.Wpf NuGet包。
按以下顺序添加这四个源文件。
MainWindow.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="F#示例" Height="250" Width="350">
<Canvas>
<Button Name="actionButton" Content="点击测试" Canvas.Left="20" Canvas.Top="30" Height="32" Width="80"/>
<TextBlock Name="resultText" Canvas.Left="20" Canvas.Top="80" Height="24" Width="200"/>
</Canvas>
</Window>
MainWindow.xaml.fs
namespace FSharpWpfDemo
type MainWindowXaml = FsXaml.XAML<"MainWindow.xaml">
type MainWindow() as this =
inherit MainWindowXaml()
let applicationStarted _ =
this.resultText.Text <- "应用程序已启动"
let windowClosing _ =
System.Console.WriteLine("窗口正在关闭")
let windowClosed _ =
System.Console.WriteLine("窗口已关闭")
let buttonClicked _ =
this.resultText.Text <- "按钮被点击成功!"
this.Title <- "F# WPF 测试成功"
do
this.Loaded.Add applicationStarted
this.Closing.Add windowClosing
this.Closed.Add windowClosed
this.actionButton.Click.Add buttonClicked
App.xaml
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<!-- 在这里可以添加全局资源 -->
</Application.Resources>
</Application>
App.xaml.fs
namespace FSharpWpfDemo
open System
type App = FsXaml.XAML<"App.xaml">
module Program =
[<STAThread; EntryPoint>]
let runApplication _ =
let appInstance = App()
let mainWindow = MainWindow()
appInstance.Run(mainWindow)
将两个XAML文件的生成操作设置为*资源*。
添加对.NET程序集UIAutomationTypes的引用。
项目文件(.fsproj)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net481</TargetFramework>
<WarnOn>3390;$(WarnOn)</WarnOn>
</PropertyGroup>
<ItemGroup>
<Resource Include="App.xaml" />
<Resource Include="MainWindow.xaml" />
<Compile Include="MainWindow.xaml.fs" />
<Compile Include="App.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FsXaml.Wpf" Version="3.1.6" />
<Reference Include="UIAutomationTypes" />
</ItemGroup>
</Project>
编译并运行应用程序。
注意:无法使用设计器添加事件处理程序,但这不是问题。只需在代码隐藏中手动添加它们,如本示例中的三个处理程序,包括测试按钮的处理程序。
已知问题
- 如果不设置为资源,调整文件顺序的ALT上下功能可能被禁用。
- XAML设计器有一些小的控制按钮,用于切换视图和隐藏视图。
引用当前程序集的UserControl
当引用当前程序集中的UserControl时,可能会遇到以下问题:
<mah:MetroWindow
xmlns:local="clr-namespace:Translator"
>
<local:SentanceUserControl
运行时异常
XamlObjectWriterException: 无法创建未知类型"{clr-namespace:Translator}SentanceUserControl"。
解决方案
这是因为当App.exe运行时,可能尚未加载控件库。程序找不到类型定义,您需要提供程序集:
<mah:MetroWindow
xmlns:local="clr-namespace:Translator;assembly=Translator"
>
微软文档参考
- net481可以引用netstandard2.0库。