共用方式為


適用於 .NET Core 3.0 和 3.1 的 Windows Forms 重大變更

Windows Forms 支援已在 3.0 版中新增至 .NET Core。 本文列出由 .NET 版本引進的 Windows Forms 重大變更。 如果您要從 .NET Framework 或舊版 .NET Core 升級 Windows Forms 應用程式(3.0 或更新版本),本文適用於您。

此頁面記載了下列重大變更:

重大變更 引進的版本
已移除控制件 3.1
如果工具提示顯示,則不會引發 CellFormatting 事件 3.1
Control.DefaultFont 已變更為 Segoe UI 9 pt 3.0
folderBrowserDialog 的 現代化 3.0
已從某些 Windows Forms 類型中移除 SerializableAttribute 3.0
AllowUpdateChildControlIndexForTabControls 相容性開關不支援 3.0
DomainUpDown.UseLegacyScrolling 兼容性開關不支援 3.0
DoNotLoadLatestRichEditControl 相容性開關不支援 3.0
DoNotSupportSelectAllShortcutInMultilineTextBox 相容性切換不受支援 3.0
DontSupportReentrantFilterMessage 相容性參數不支援 3.0
EnableVisualStyleValidation 相容性開關不支援 3.0
UseLegacyContextMenuStripSourceControlValue 相容性開關不支援 3.0
UseLegacyImages 兼容性切換不支援 3.0
Visual Basic 的 About 和 SplashScreen 範本已中斷 3.0

.NET Core 3.1

已移除的控制件

從 .NET Core 3.1 開始,部分 Windows Forms 控件已無法使用。

變更描述

從 .NET Core 3.1 開始,就無法再使用各種 Windows Forms 控件。 .NET Framework 2.0 引進了具有更佳設計和支援的取代控件。 已被取代的控制項先前已從設計工具工具箱中移除,但仍可供使用。

下列型態已無法使用:

推出的版本

3.1

每個移除的控制件都有建議的取代控制件。 請參閱下表:

已移除控制元件(API) 建議替代方案 已移除的相關聯 API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell、DataGridRow、 DataGridTableCollection、DataGridColumnCollection、DataGridTableStyle、DataGridColumnStyle、DataGridLineStyle、DataGridParentRowsLabel、DataGridParentRowsLabelStyle、DataGridBoolColumn、DataGridTextBox、GridColumnStylesCollection、GridTableStylesCollection、HitTestType
主選單 MenuStrip
選單 ToolStripDropDown、ToolStripDropDownMenu 選單項目集合
選單項目 ToolStripMenuItem(工具列選單項目)
工具列 ToolStrip 工具列外觀
工具列按鈕 工具列按鈕 ToolBarButtonClickEventArgs、ToolBarButtonClickEventHandler、ToolBarButtonStyle、ToolBarTextAlign

類別

Windows Forms

受影響的 API


當顯示工具提示時,不會觸發 CellFormatting 事件。

DataGridView 現在會顯示儲存格的文字和錯誤工具提示,當滑鼠懸停於上方時,以及透過鍵盤選取時。 如果顯示了工具提示,則不會觸發 DataGridView.CellFormatting 事件。

變更描述

在 .NET Core 3.1 之前,將 ShowCellToolTips 屬性設定為 trueDataGridView 在滑鼠懸停在儲存格上時會顯示儲存格文字和錯誤的工具提示。 當透過鍵盤選取儲存格時,不會顯示工具提示(例如,使用 Tab 鍵、快速鍵或箭頭流覽)。 如果使用者編輯儲存格,然後在 DataGridView 仍處於編輯模式時,將滑鼠停留在未設定 ToolTipText 屬性的單元格上,就會引發 CellFormatting 事件來格式化單元格的文字以在儲存格中顯示。

為了符合輔助功能標準,從 .NET Core 3.1 開始,設定 ShowCellToolTips 屬性為 trueDataGridView,不僅在單元格懸停時,還在透過鍵盤選取時,均會顯示單元格的文字和錯誤的工具提示。 由於這項變更,當 DataGridView 處於編輯模式時,沒有 ToolTipText 屬性集的單元格暫留時,CellFormatting 事件 不會 引發。 不會引發事件,因為滑鼠指向的單元格內容會顯示為工具提示,而不是顯示在儲存格中。

引進的版本

3.1

DataGridView 處於編輯模式時,重構相依於 CellFormatting 事件的任何程序代碼。

類別

Windows Forms

受影響的 API

沒有


.NET Core 3.0

默認控件字型已變更為 Segoe UI 9 pt

變更描述

在 .NET Framework 中,Control.DefaultFont 屬性設定為 Microsoft Sans Serif 8.25 pt。 下圖顯示使用預設字型的視窗。

.NET Framework 中的預設控件字型

從 .NET Core 3.0 開始,預設字型會設定為 Segoe UI 9 pt (與 SystemFonts.MessageBoxFont相同的字型)。 由於這項變更,表單和控制項的大小增大約 27%,以考量新預設字型的較大尺寸。 例如:

.NET Core 中的預設控件字型

這項變更是為了遵循 Windows 用戶體驗(UX)指導方針

引進的版本

3.0

由於表單和控制項的大小有所變更,因此請確保您的應用程式正確呈現。

若要保留單一表體的原始字型,請將預設字型設定為 Microsoft Sans Serif 8.25 pt。 例如:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

或者,您可以透過下列其中一種方式來變更整個應用程式的預設字型:

  • ApplicationDefaultFont MSBuild 屬性設定為 「Microsoft Sans Serif, 8.25pt」。。 這是慣用的技術,因為它允許 Visual Studio 在設計工具中使用新的設定。

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • 藉由呼叫 Application.SetDefaultFont(Font)

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

類別

  • Windows Forms

受影響的 API

沒有。


FolderBrowserDialog 的現代化

.NET Core 的 Windows Forms 應用程式中,FolderBrowserDialog 控制項已經變更。

變更描述

在 .NET Framework 中,Windows forms 會針對 FolderBrowserDialog 控件使用下列對話框:

.NET Framework 中的 FolderBrowserDialogControl

在 .NET Core 3.0 中,Windows Forms 使用 Windows Vista 中引進的較新 COM 型控件:

.NET Core 中的 FolderBrowserDialogControl

引進的版本

3.0

對話框會自動升級。

如果您想要保留原始對話框,請在顯示對話方塊之前,將 FolderBrowserDialog.AutoUpgradeEnabled 屬性設定為 false,如下列代碼段所示:

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

類別

Windows Forms

受影響的 API


已從某些 Windows Forms 類別中移除 SerializableAttribute

SerializableAttribute 已從某些沒有已知二進位串行化案例的 Windows Forms 類別中移除。

變更描述

下列類型在 .NET Framework 中會被 SerializableAttribute 屬性裝飾,而該屬性在 .NET Core 中已被移除:

從歷史上看,這種串行化機制有嚴重的維護和安全性考慮。 在型別上維護 SerializableAttribute 表示必須測試這些型別,以進行版本對版本的序列化變更,以及可能的不同框架間的序列化變更。 這會使這些類型更難發展,而且維護成本很高。 這些類型沒有已知的二進位串行化案例,可將移除屬性的影響降到最低。

如需詳細資訊,請參閱 二進位串行化

引進的版本

3.0

更新任何可能相依於標示為可序列化之類型的程式碼。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 AllowUpdateChildControlIndexForTabControls 相容性開關

在 .NET Framework 4.6 和更新版本的 Windows Forms 中支援 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 兼容性開關,但在 .NET Core 或 .NET 5.0 及更新版本中不支援。

變更描述

在 .NET Framework 4.6 和更新版本中,選取索引卷標會重新排序其控件集合。 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 相容性參數可讓應用程式在不需要此行為時略過此重新排序。

在 .NET Core 和 .NET 5.0 及更高版本中,不支援 Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls 開關。

引進的版本

3.0

移除開關。 此開關不受支持,且沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 DomainUpDown.UseLegacyScrolling 相容性參數

.NET Framework 4.7.1 中引入的 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 兼容性開關在 .NET Core 或 .NET 5.0 及更高版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.7.1 開始,Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性開關允許開發人員選擇退出各自獨立的 DomainUpDown.DownButton()DomainUpDown.UpButton() 動作。 開關已還原舊版行為,若上下文文字存在,則會忽略 DomainUpDown.UpButton(),並且開發人員必須在控件上先使用 DomainUpDown.DownButton() 動作,然後才是 DomainUpDown.UpButton() 動作。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 及其後續版本中,不支援 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 開關。

推出的版本

3.0

拿掉開關。 該開關不受支持,也沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotLoadLatestRichEditControl 相容性開關

.NET Framework 4.7.1 引入的 Switch.System.Windows.Forms.UseLegacyImages 相容性開關,在 .NET Core 或 .NET 5.0 和更高版本的 Windows Forms 中不受支持。

變更描述

在 .NET Framework 4.6.2 和舊版中,RichTextBox 控件會具現化 Win32 RichEdit 控件 v3.0,而針對以 .NET Framework 4.7.1 為目標的應用程式,RichTextBox 控件會具現化 RichEdit v4.1 (在 msftedit.dll中)。 引進了 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 相容性參數,以允許以 .NET Framework 4.7.1 和更新版本為目標的應用程式退出新的 RichEdit v4.1 控件,並改用舊的 RichEdit v3 控件。

在 .NET Core 和 .NET 5.0 及其更新版本中,不支援 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 選項。 僅支援新版本的 RichTextBox 控件。

引進的版本

3.0

拿掉 開關。 不支持此開關,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotSupportSelectAllShortcutInMultilineTextBox 相容性切換設定

.NET Framework 4.6.1 中引進的 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 兼容性參數,在 .NET Core 和 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.6.1 開始,在 TextBox 控件中選擇 Ctrl + A 快捷鍵會選取所有文字。 在 .NET Framework 4.6 和舊版中,如果 Textbox.ShortcutsEnabled 屬性都設定為 ,則選取 ctrlCtrl 鍵無法選取所有文字。 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 相容性開關是在 .NET Framework 4.6.1 中引入的,以維持原有行為。 如需詳細資訊,請參閱 TextBox.ProcessCmdKey

在 .NET Core、.NET 5.0 及更高版本中,不支援 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 開關。

引進的版本

3.0

移除開關。 此開關不受支持,且沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 DontSupportReentrantFilterMessage 相容性參數

.NET Framework 4.6.1 中引進的 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 兼容性參數,在 .NET Core 和 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.6.1 開始,Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 相容性開關會在使用自定義 IMessageFilter.PreFilterMessage 實作呼叫 Application.FilterMessage 訊息時,解決可能出現的 IndexOutOfRangeException 例外問題。 如需進一步資訊,請參閱 降低風險:自訂 IMessageFilter.PreFilterMessage 的實作

在 .NET Core 和 .NET 5.0 及更高版本中,不支援 Switch.System.Windows.Forms.DontSupportReentrantFilterMessage 開關。

引進的版本

3.0

移除開關。 不受支持的開關,且沒有其他功能可替代。

類別

Windows Forms

受影響的 API


不支援 EnableVisualStyleValidation 相容性切換

在 .NET Core 或 .NET 5.0 和更新版本的 Windows Forms 中,Switch.System.Windows.Forms.EnableVisualStyleValidation 相容性開關不受支援。

變更描述

在 .NET Framework 中,Switch.System.Windows.Forms.EnableVisualStyleValidation 兼容性參數允許應用程式選擇不驗證以數值形式提供的視覺樣式。

在 .NET Core 和 .NET 5.0 及更新版本中,不支援 Switch.System.Windows.Forms.EnableVisualStyleValidation 開關。

引進的版本

3.0

拔掉開關。 開關不受支持,且沒有替代方案。

類別

Windows Forms

受影響的 API

  • 沒有

不支援 UseLegacyContextMenuStripSourceControlValue 相容性開關

.NET Framework 4.7.2 中引進的 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 兼容性參數在 .NET Core 或 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.7.2 開始,Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 兼容性參數可讓開發人員選擇退出 ContextMenuStrip.SourceControl 屬性的新行為,該屬性現在會傳回源控件的參考。 屬性的先前行為是返回 null。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 及之後的版本中,不支援 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 開關。

推出的版本

3.0

移除開關。 未支持此功能開關,且無任何替代功能可用。

類別

Windows Forms

受影響的 API


不支援 UseLegacyImages 相容性切換開關

.NET Framework 4.8 中引進的 Switch.System.Windows.Forms.UseLegacyImages 相容性參數在 .NET Core 或 .NET 5.0 和更新版本的 Windows Forms 中不受支援。

變更描述

從 .NET Framework 4.8 開始,Switch.System.Windows.Forms.UseLegacyImages 兼容性參數解決了在高 DPI 環境中 ClickOnce 案例中可能發生的影像縮放問題。 當設定為 true時,參數可讓用戶在縮放比例設定為大於 100%的高 DPI 顯示器上還原舊版影像縮放比例。 如需詳細資訊,請參閱 GitHub 上的 .NET Framework 4.8 版本資訊

在 .NET Core 和 .NET 5.0 及後續版本中,不支援 Switch.System.Windows.Forms.UseLegacyImages 開關。

引進的版本

3.0

拿掉 開關。 此開關不受支持,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API

  • 沒有

About 和 SplashScreen 模板功能已損壞

Visual Studio 所產生的 About.vbSplashScreen.vb 檔案包含對 My 命名空間中某些型別的參考,而這些型別在 .NET Core 3.0 和 3.1 中不可用。

引進的版本

3.0

變更描述

.NET Core 3.0 和 3.1 不包含完整的 Visual Basic My 支援。 關於SplashScreen Visual Studio for Visual Basic Windows Forms 應用程式中的窗體範本參考 My.Application.Info 類型中無法使用的屬性。

.NET 5 已改善 Visual Basic My 支援,將您的項目升級至 .NET 5 或更新版本。

-或-

修正應用程式中 AboutSplashScreen 類型中的編譯程式錯誤。 使用 System.Reflection.Assembly 類別來取得 My.Application.Info 類型所提供的資訊。 這裡提供這兩種格式的直接移植。

提示

這是範例程式代碼和未優化。 應該快取屬性清單,以減少表單載入時間。

關於

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

SplashScreen

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

類別

Visual Basic Windows Forms

受影響的 API

沒有


另請參閱