.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 應用程式,本文對您適用。
本頁面說明下列中斷性變更:
.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 |
MainMenu | MenuStrip | |
功能表 | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
MenuItem | ToolStripMenuItem | |
ToolBar | ToolStrip | ToolBarAppearance |
ToolBarButton | ToolStripButton | 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 的現代化
FolderBrowserDialog 控制項在 .NET Core Windows Forms 應用程式中已變更。
變更描述
在 .NET Framework 中,Windows Forms 會針對 FolderBrowserDialog 控制項使用下列對話方塊:
在 .NET Core 3.0 中,Windows Forms 使用 Windows Vista 中引進的較新 COM 型控制項:
導入的版本
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 中,該屬性已遭移除:
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 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.ShortcutsEnabled 和 TextBox.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.vb
和 SplashScreen.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 應用程式中的 About 和 SplashScreen 表單範本參考型別中 My.Application.Info
無法使用的屬性。
建議的動作
Visual Basic My
支援已在 .NET 5 中改善,將您的專案升級至 .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
無
另請參閱
- 將 Windows Forms 應用程式移植到 .NET Core (部分機器翻譯)