簡體   English   中英

看到C#windows形成來自F#的項目代碼

[英]seeing C# windows forms project code from F#

我有一個C#Windows窗體項目,其中包含一些C#代碼。

問題:我如何擁有一個F#文件,我可以編寫F#代碼,但仍然引用我在Form1.cs上的所有C#代碼(包括GUI)。

我可以成功地做到這一點:
- 創建C#Windows窗體項目
- 創建一個F#Library項目
- 從我的C#項目中引用F#Library DLL
- 這樣我可以從C#調用F#函數

但我還是看不到來自F#的按鈕和文本框
我理解那是因為它是一個庫,它不能引用System.Windows.Forms

那么我該如何解決這個問題呢? 我不希望它是一個庫或者這個或那個,我只是希望它是一個允許我編寫F#代碼的文件,同時能夠引用我的C#表單和代碼。

我想你可以說我想要一個F#文件,它也是一個“部分類Form1”,這樣我就可以繼續為同一個Project編寫代碼,但是使用F#代替。 我怎么做?

如果我正確理解了這個問題,你實際上是在詢問如何構建你的應用程序,以便你可以使用WinForms設計器(僅在C#/ VB中可用)來創建表單,同時在F#中編寫應用程序邏輯。

首先,有沒有辦法在一個單一的項目,這意味着你不能寫東西就像一個混合兩種語言partial用在C#F#和其他部分一個部分類(這在技術上幾乎是不可能的)。 因此,唯一的選擇是編寫一個F#項目和一個C#項目,並引用另一個項目。 有兩種方法可以做到這一點:

(根據你的回答和評論,我想你可能更喜歡第一個)

從F#應用程序引用C#庫:一種選擇是在C#中創建一個簡單的WinForms庫項目,以包含使用WinForms設計器創建的表單(可能還有其他控件等),而不是其他任何內容。 然后,您將從在F#中創建的應用程序引用此庫,並在F#應用程序中實現所有用戶交互。

如果確保將WinForms設計器創建的YourForm類以及添加到表單中的所有相關控件標記為public ,則可以引用該表單並從F#應用程序控制它。

  • 我在本書的一個示例中使用了這種方法,所以如果您正在尋找一個示例,您可以查看第14章的源代碼 (查找“FSharpEffects”)

從C#應用程序引用F#庫:以這種方式構建應用程序時,您需要創建一個F#庫,它公開應用程序所需的所有基本功能,然后從C#應用程序引用它。 C#應用程序將添加所有用戶界面交互代碼,它將調用F#庫來執行實際工作。

在這種情況下,F#庫對C#表單一無所知。 如果從F#庫引用System.Windows.Forms ,則可能需要一些WinForms控件作為參數(例如,配置它們和加載數據),但它不會知道C#中聲明的控件。

這種方法的一個可能的擴展是在F#庫中聲明一個接口,在C#應用程序中實現它,然后將一個實現傳遞回F#庫。 該接口可能會暴露應用程序的一些重要屬性(例如,允許訪問所有重要的WinForms控件)。 一旦為F#庫提供了接口的實現,F#庫就可以使用它來操作應用程序。

(帶接口的方法需要編寫更多代碼,可能不太靈活,但如果你想用C#編寫主應用程序並在那里聲明表單,那么它可能是最好的選擇)

您需要將對System.Windows.Forms.dll的引用添加到F#項目,並將Form1類及其成員的可見性設置為public

(庫也可以引用System.Windows.Forms;這就是可重用的控件項目)

你還需要一些方法來調用F#代碼; 您可能希望將F#項目設置為EXE(調用Application.Run )和C#項目到庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM