共用方式為


.NET Core 3.0 和 3.1 Windows Forms 的中斷性變更

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

本頁面說明下列中斷性變更:

重大變更 導入的版本
移除的控制項 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
MainMenu MenuStrip
功能表 ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton 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 的現代化

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

變更描述

在 .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

已從沒有已知二進位序列化案例的一些 Windows Forms 類別中移除 SerializableAttribute

變更描述

在 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.7.1 中引進的 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性參數。

變更描述

從 .NET Framework 4.7.1 開始,Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 相容性參數可讓開發人員退出獨立 DomainUpDown.DownButton()DomainUpDown.UpButton() 動作。 參數已還原舊版行為,如果內容文字存在,則會忽略 DomainUpDown.UpButton(),而且開發人員必須在 DomainUpDown.UpButton() 動作之前使用控制項上的 DomainUpDown.DownButton() 動作。 如需詳細資訊,請參閱 <AppContextSwitchOverrides> 元素

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling 參數。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotLoadLatestRichEditControl 相容性參數

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

變更描述

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

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl 參數。 僅支援新版本的 RichTextBox 控制項。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DoNotSupportSelectAllShortcutInMultilineTextBox 相容性參數

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

變更描述

從 .NET Framework 4.6.1 開始,選取 TextBox 控制項中的 Ctrl + A 快速鍵會選取所有文字。 在 .NET Framework 4.6 和舊版中,如果 Textbox.ShortcutsEnabledTextBox.Multiline 屬性都設定為 true,則選取 Ctrl + A 快速鍵無法選取所有文字。 .NET Framework 4.6.1 引進 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 相容性參數,以保留原始行為。 如需詳細資訊,請參閱:TextBox.ProcessCmdKey

在 .NET Core 和 .NET 5.0 與更新版本中,不支援 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox 參數。

導入的版本

3.0

移除參數。 不支援參數,而且沒有可用的替代功能。

類別

Windows Forms

受影響的 API


不支援 DontSupportReentrantFilterMessage 相容性參數

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

變更描述

從 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.7.2 中引進的 Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue 相容性參數。

變更描述

從 .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 Core 或 .NET 5.0 與更新版本上的 Windows Forms 不支援 .NET Framework 4.8 中引進的 Switch.System.Windows.Forms.UseLegacyImages 相容性參數。

變更描述

從 .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 檔案包含並非可用 .NET Core 3.0 和 3.1 的 My 命名空間型別參考。

導入的版本

3.0

變更描述

.NET Core 3.0 和 3.1 不包含完整的 Visual Basic My 支援。 Visual Studio for Visual Basic Windows Forms 應用程式中的 AboutSplashScreen 表單範本參考型別中 My.Application.Info 無法使用的屬性。

Visual Basic My 支援已在 .NET 5 中改善,將您的專案升級至 .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


另請參閱