用于编程式WPF GUI的C#和F#

我试图决定在企业软件开发中如何使用F#和C#。 math代码的F#是一个不费吹灰之力。 我喜欢使用F#进行GUI工作,尽pipe它缺lessGUIdevise器支持,但是,当然,C#GUI人员在工业中有更多的资源可用性。 但是,我不太熟悉C#+ XAML GUI开发,因此我担心引入偏见。

在一个客户端的情况下,他们有几十个相当静态的GUI(每年更换)和一些其他非常dynamic的GUI(例如业务规则引擎)。 他们已经拥有F#代码,并已经投入了F#培训,所以技能可用性不是问题。 我的印象是,C#+ XAML可以让你轻松地构build静态GUI(几个滑块,一些文本框等),但是我看不到GUIdevise器如何帮助像编程规则引擎这样的程序化GUI。 我是否认为保持大部分静态GUI(例如,向100个独立的GUI添加新的字段)将需要手动操作? 另外,我认为GUIdevise器在大量程序化的GUI环境中几乎没有用处,所以像业务规则引擎这样的东西,主要是用C#+ XAML编写的,很less使用GUIdevise器。

我已经在C#和F#中做了大量的GUI和非GUI编程,在工作和娱乐中,编程和静态程度都很高,我相信您所expression的印象是准确和实用的。 (请注意,我比WinForm更加熟悉WPF,但我不认为这里的差异很重要)。

我的印象是,C#+ XAML可以让你轻松地构build静态GUI(几个滑块,一些文本框等),但是我看不到GUIdevise器如何帮助像编程规则引擎这样的程序化GUI。

这绝对是我的经验。 对于大多数静态GUI,我更喜欢使用C#的WinFormsdevise器。 工具组合非常适合这些场景,而且比用F#和没有devise器的手工编写graphics用户界面(现在,如果有devise人员支持F#,我会毫不犹豫地宁愿这么做)。 我只有rest是一个例子,我喜欢C#的WinFormsdevise师在纯F#。

对于繁重的程序化GUI,我认为最好完全避免devise师,而不是试图去半devise师半程序化(它变得真正混乱,真正快速)。 所以在这些情况下,我绝对更喜欢在F#中手动编写GUI,因为每个人都知道F#是更具performance力的语言;) FsEye是一个例子,我喜欢使用WinFormsdevise器在C#上使用纯F#。

我是否认为保持大部分静态GUI(例如,向100个独立的GUI添加新的字段)将需要手动操作?

大概。 我不相信这个问题真的有现成的解决scheme,因为它确实相当大。 但是,可能有一些最佳实践可用于为您的软件套件构build自定义解决scheme。

另外,我认为GUIdevise器在大量程序化的GUI环境中几乎没有用处,所以像业务规则引擎这样的东西,主要是用C#+ XAML编写的,很less使用GUIdevise器。

是的,就像我早说的那样,我相信你不应该试图把GUIdevise师与繁重的程序化GUI编程混合在一起。

我最近使用纯F#和WPF构build了一个有向图可视化应用程序。

对于'编程'GUI部分,我基本上构build了WPF自定义控件,可以使用数据绑定和MVVM进行操作。

对于静态部分,我使用带有开箱即用和自定义WPF控件的XAML。

我广泛使用了FSharpX WPFtypes提供程序来进行MVVM绑定。

这本“书”帮助我开始了很多。 http://wpffsharp.codeplex.com/

有些事情不是自然而然地用F#和WPF来实现的,但几乎在所有情况下都find了相当优雅的解决scheme。 一些WPF数据绑定string确实变得庞大而笨拙。

我不知道如何回答这个问题,因为有点难以坚持,所以我只给你0.05美元:

如果你使用一个好的MVVM来做WPF(甚至有受FP-land影响的Rx版本),你将不会编写代码隐藏(或几乎没有) – 而WPFtypes提供者和所有其他优秀的东西你已经可以写WPF-F#应用程序没有任何问题了(甚至devise师的支持是没有问题的 – 只要使用BLEND,如果可以的话) – 如果没有,你仍然可以把GUI分离成一个愚蠢的C#-lib。

那为什么我不用100%的F#编写大部分的GUI呢?

说实话…这是ReSharper缺乏重构和工具 – 这只是令人沮丧,我不能searchF#的符号或types,因为在VS / R#呃现在没有惊人的支持。

这很奇怪,但写了MVVM代码,你必须为你的Viewmodel创build许多简单的代码似乎更容易在C#中使用正确的工具(例如:我可以configurationR#er来插入所有代码公共probertys与私人/公共设置和INotifyPropertyChanged基于内部字段只是击中 – 和select正确的选项 – 这将产生很多非常愚蠢的代码,但它可以在F#中更快)

正如你所指出的那样,在一般IT行业的程序员中,F#是一个非常稀缺的技能,而每个人和他的狗都知道C#(或者Java,C / C ++)。

因此,从纯粹的pipe理angular度来看,通过F#使用C#+ XAML可能更有意义,因为有许多因素:

  1. 程序员的薪水 – 聘请一位F#大师增加了很多薪水预算
  2. 开发时间 – 这可以用任何一种方式来看,比较好
  3. 企业风险 – F#的使用大大增加了每个类别的风险因素:
    • 程序员离开公司,并把他们带到知识产权
    • 程序员离开公司和公司不能雇用更换=>项目错过最后期限
    • 公司没有足够的指标来衡量项目所需的时间
    • 语言变得糟糕,代码必须移植(不是一个大问题,但仍然比C#风险更高)
    • 等等

然而,从工程angular度来看,F#(可能带有一个可视化附加库)能够简单地生成一个强大的GUI。 不过,C#也具有这种function – 您可以通过编程方式生成整个GUI,而无需使用XAML。

至于为100多个graphics用户界面添加一个新项目,在这里我看不出XAML是如何不利的。 如果我正确地理解了你的问题,你可以使用一个数据模板,你可以在XAML中更新一次,并且改变所有的GUI。

总之,我build议你除非你有充分的理由使用F#,否则坚持使用C#,因为它可以长期降低你公司的风险。

我在这里看到很多令人困惑的答案和解决scheme。 F#和C#可以在解决scheme中结合使用。 让C#pipe理GUI和F#pipe理包。 另外,XAML和WinForms是毫不费力的。 使用XAML,有足够的代码空间可以做任何你需要的东西。 如果你使用WinForms,那么我确信你需要立即退出。 例如,WPF远比弹性和非常强大的GUI选项远远高于WinForms。 更不用说XAML的约束力了。 XAML是静态的,但与代码之间的沟通很好,可以与任何和所有的.NET语言进行通信。 使用F#,一起使用C#,肯定会永远离开WinForms的世界。 这是我做的一个小项目。 它只使用WPF,Silverlight,WCF,F#,C#和VB.NET的组合。 WinForms没有被触及,如果你仔细观察,你会发现用WinForms实现这一点会花费很多时间。 我可以用一种语言来完成这个任务,但是交换可以根据情况节省时间,但是我只是前进,从不后退。 WinForms以及所有其他遗留选项被忽略,从不使用。