我刚刚将其中一个FsXaml演示程序转换为解释的F#脚本,以便我可以试验并学习.它不会运行,并且解释器给了我以下错误消息:
System.NotSupportedException:动态程序集中不支持调用的成员.
在System.Reflection.Emit.InternalAssemblyBuilder.GetManifestResourceStream(字符串名称)
在FsXaml.InjectXaml.from(字符串文件,对象根)
在FsXaml.App.InitializeComponent()在FsXaml.App..ctor()
在FSI_0002.main [一](a argv)在C:\ Users\bobmc\OneDrive\FSharp\Learning\WPFExamples\FsXaml\demos\WpfSimpleMvvmApplication\WPFApp.fsx:第104行
at.$ FSI_0002.main @()in C:\ Users\bobmc\OneDrive\FSharp\Learning\WPFExamples\FsXaml\demos\WpfSimpleMvvmApplication\WPFApp.fsx:第109行
我可以将F#解释器与FsXaml一起使用吗?感谢大家的帮助.
F#不支持部分类,也不支持XAML文件的预编译.解决方法:代替编译时代码,在运行时加载图形对象定义.有多种方法可以为XamlReader提供引用的资源文件的内容.
open System.Windows
// from Resource
let uri = System.Uri "pack://application:,,,/AssemblyName;component/MainWindow.xaml"
let info = Application.GetResourceStream uri
let wnd = Markup.XamlReader.Load info.Stream :?> Window
// from Embedded resource
let assembly = System.Reflection.Assembly.GetExecutingAssembly()
let stream = assembly.GetManifestResourceStream "MainWindow.xaml"
let wnd  = Markup.XamlReader.Load stream :?> Window
Run Code Online (Sandbox Code Playgroud)
类型提供程序应该能够将至少部分工作转移回编译时.
open FsXaml
type MainWindow = XAML<"MainWindow.xaml"> 
let mainwnd = new MainWindow()
let wnd = mainwnd.Root
Run Code Online (Sandbox Code Playgroud)
类型安全(和发现)的增益似乎是微不足道的:每个资源的一个运行时类型减少.还有其他优点吗?
我正在尝试将WPF与F#一起使用.我使用F#Empty Windows App模板创建了一个项目(实际上,我使用不同的设置创建了几个).然后我添加了FSharp.ViewModule和FsXaml.Wpf引用.当项目只有MainWindow.xaml和MainWindow.xaml.fs时,它工作正常.但是,只要我添加了另一个.xaml View文件和.fs ViewModel文件,我就会在.fs文件顶部的"namespace ViewModels"声明中收到以下错误:
The type provider '...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' reported an error: Assembly attribute 'TypeProviderAssemblyAttribute' refers to a designer assembly 'FsXaml.Wpf.TypeProvider' which cannot be loaded or doesn't exist. Could not load file or assembly 'file:///...\packages\FsXaml.Wpf.2.1.0\lib\net45\FsXaml.Wpf.TypeProvider.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
Run Code Online (Sandbox Code Playgroud)
在帖子"FsXaml加载错误"(我无法添加评论,因为我没有足够的声誉)中描述了类似的问题.但我已经尝试了那里给出的答案 - 更改CPU和F#运行时 - 并且两者都不起作用.
我在Windows 7 SP1 64位虚拟机中使用Visual Studio 2015社区版.我尝试使用以下框架和DLL版本:
编辑1:在回复下面的里德评论时,这是我的两个显示错误的代码文件.首先,MainWindow.xaml.fs:
namespace ViewModels
open FSharp.ViewModule
open FsXaml
type MainView = XAML<"MainWindow.xaml", true> …Run Code Online (Sandbox Code Playgroud) 在我的xaml我有一个按钮和一个TextBlock
<TextBlock Text="{Binding AText}" FontSize="20"/>
<Button Content="Click" Command="{Binding MyCommand}" Grid.Row="1"/>
Run Code Online (Sandbox Code Playgroud)
在我的ViewModel中,我有以下代码
let aText = self.Factory.Backing(<@ self.AText @>, "Initial Text")
let asyncTask x = async {
    self.AText <- "Loading"
    do! Async.Sleep(5000)
    self.AText <- "Loaded"
} 
member self.AText with get() = aText.Value and set(v) = aText.Value <- v    
member self.MyCommand = self.Factory.CommandAsyncChecked(asyncTask, fun _ -> true)
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,它会被禁用并保持不变,直到它完成asyncTask.我认为设置canExecute为true将改变行为,但事实并非如此!
如何控制按钮的行为?
FsXaml似乎仅适用于至少面向.NET 4.5的项目.
它有一种方法来使用它同时针对.NET 4.0?
如果是这样我怎么能实现这个目标?
我想绑定到使用FsXaml和FSharp.ViewModule构建的MVVM F#应用程序中的WPF TextBox.我在此处描述的应用程序中添加了一个名为"SetA"的命令,并尝试使用以下XAML绑定到它:
<TextBox Text="{Binding Score.ScoreA, Mode=OneWay}" FontFamily="Lucida Console">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <fsx:EventToCommand Command="{Binding SetA}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
从ScoreA属性正确填充TextBox,但是当我在TextBox中键入新值时,不会调用SetA命令.我对F#很满意,但这是我的第一个WPF MVVM应用程序,所以我不确定我做错了什么.当用户更改文本值时,如何触发我的SetA处理程序?
这是我的ViewModel:
type MainViewModel(controller : Score -> ScoringEvent -> Score) as self = 
    inherit EventViewModelBase<ScoringEvent>()
    let score = self.Factory.Backing(<@ self.Score @>, Score.zero)
    let eventHandler ev =
        score.Value <- controller score.Value ev
    do
        self.EventStream
        |> Observable.add eventHandler
    member this.IncA = this.Factory.EventValueCommand(IncA)
    member this.DecA = this.Factory.EventValueCommandChecked(DecA, (fun _ -> this.Score.ScoreA > 0), [ <@@ this.Score @@> ])
    member this.IncB = …Run Code Online (Sandbox Code Playgroud)