标签: fsxaml

FsXaml可以用在F#解释的脚本中吗?

我刚刚将其中一个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一起使用吗?感谢大家的帮助.

xaml f# fsxaml

7
推荐指数
1
解决办法
167
查看次数

FsXaml类型提供程序优于XamlReader

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)

类型安全(和发现)的增益似乎是微不足道的:每个资源的一个运行时类型减少.还有其他优点吗?

xaml f# fsxaml

6
推荐指数
1
解决办法
277
查看次数

无法加载FsXaml.Wpf.TypeProvider

我正在尝试将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版本:

  • NET Framework 4.5和4.6
  • F#3.0和4.0
  • FSharp.ViewModule 0.9.9和0.9.9.3
  • FsXaml.Wpf 2.0.0和2.1.0

编辑1:在回复下面的里德评论时,这是我的两个显示错误的代码文件.首先,MainWindow.xaml.fs:

namespace ViewModels
open FSharp.ViewModule
open FsXaml

type MainView = XAML<"MainWindow.xaml", true> …
Run Code Online (Sandbox Code Playgroud)

wpf f# mvvm fsxaml fsharp.viewmodule

5
推荐指数
1
解决办法
179
查看次数

如何在执行异步任务时保持按钮启用

在我的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.我认为设置canExecutetrue将改变行为,但事实并非如此!

如何控制按钮的行为?

f# fsxaml fsharp.viewmodule

5
推荐指数
1
解决办法
54
查看次数

我可以在.NET 4.0中使用FsXaml吗?

FsXaml似乎仅适用于至少面向.NET 4.5的项目.
它有一种方法来使用它同时针对.NET 4.0?
如果是这样我怎么能实现这个目标?

f# fsxaml

3
推荐指数
1
解决办法
89
查看次数

在F#WPF MVVM应用程序中绑定到TextBox的TextChanged事件

我想绑定到使用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)

wpf xaml f# mvvm fsxaml

3
推荐指数
1
解决办法
1030
查看次数

标签 统计

f# ×6

fsxaml ×6

xaml ×3

fsharp.viewmodule ×2

mvvm ×2

wpf ×2