適用於 .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 |
如果工具提示顯示,則不會引發 |
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 引進了具有更佳設計和支援的取代控件。 已被取代的控制項先前已從設計工具工具箱中移除,但仍可供使用。
下列型態已無法使用:
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
推出的版本
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
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
當顯示工具提示時,不會觸發 CellFormatting 事件。
DataGridView 現在會顯示儲存格的文字和錯誤工具提示,當滑鼠懸停於上方時,以及透過鍵盤選取時。 如果顯示了工具提示,則不會觸發 DataGridView.CellFormatting 事件。
變更描述
在 .NET Core 3.1 之前,將 ShowCellToolTips 屬性設定為 true
的 DataGridView 在滑鼠懸停在儲存格上時會顯示儲存格文字和錯誤的工具提示。 當透過鍵盤選取儲存格時,不會顯示工具提示(例如,使用 Tab 鍵、快速鍵或箭頭流覽)。 如果使用者編輯儲存格,然後在 DataGridView 仍處於編輯模式時,將滑鼠停留在未設定 ToolTipText 屬性的單元格上,就會引發 CellFormatting 事件來格式化單元格的文字以在儲存格中顯示。
為了符合輔助功能標準,從 .NET Core 3.1 開始,設定 ShowCellToolTips 屬性為 true
的 DataGridView,不僅在單元格懸停時,還在透過鍵盤選取時,均會顯示單元格的文字和錯誤的工具提示。 由於這項變更,當 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 Core 3.0 開始,預設字型會設定為 Segoe UI 9 pt
(與 SystemFonts.MessageBoxFont相同的字型)。 由於這項變更,表單和控制項的大小增大約 27%,以考量新預設字型的較大尺寸。 例如:
中的預設控件字型
這項變更是為了遵循 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 控件使用下列對話框:
中的 FolderBrowserDialogControl
在 .NET Core 3.0 中,Windows Forms 使用 Windows Vista 中引進的較新 COM 型控件:
中的 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 中已被移除:
System.InvariantComparer
- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore
- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRef
System.Resources.ResXDataNode
System.Resources.ResXFileRef
- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCT
System.Windows.Forms.NativeMethods.MSG
從歷史上看,這種串行化機制有嚴重的維護和安全性考慮。 在型別上維護 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 和舊版中,如果 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.vb
和 SplashScreen.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 或更新版本。
-或-
修正應用程式中 About 和 SplashScreen 類型中的編譯程式錯誤。 使用 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
沒有