.NET Core 3.0 および 3.1 用 Windows フォームの破壊的変更
Windows フォームのサポートは、バージョン 3.0 の .NET Core に追加されました。 この記事では、導入された .NET バージョンによる Windows フォームの破壊的変更について説明します。 Windows フォーム アプリを .NET Framework または以前のバージョンの .NET Core (3.0 以降) からアップグレードする場合は、この記事が適用されます。
このページでは、次の重大な変更について説明します。
.NET Core 3.1
削除されたコントロール
.NET Core 3.1 以降では、一部の Windows フォーム コントロールは使用できなくなりました。
説明の変更
.NET Core 3.1 以降では、さまざまな Windows フォーム コントロールは使用できなくなりました。 .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 |
---|---|---|
コンテキストメニュー | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell、DataGridRow、DataGridTableCollection、DataGridColumnCollection、DataGridTableStyle、DataGridColumnStyle、DataGridLineStyle、DataGridParentRowsLabel、DataGridParentRowsLabelStyle、DataGridBoolColumn、DataGridTextBox、GridColumnStylesCollection、GridTableStylesCollection、HitTestType |
MainMenu | MenuStrip | |
メニュー | ToolStripDropDown、ToolStripDropDownMenu | メニューアイテムコレクション |
メニュー項目 | ToolStripMenuItem | |
ツールバー | ToolStrip | ツールバーの外観 |
ToolBarButton | ToolStripButton | ToolBarButtonClickEventArgs、ToolBarButtonClickEventHandler、ToolBarButtonStyle、ToolBarTextAlign |
カテゴリ
Windows フォーム
影響を受ける 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 フォーム
影響を受ける API
None
.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 での既定のコントロール フォントの
この変更は、
導入されたバージョン
3.0
推奨されるアクション
フォームとコントロールのサイズが変更されたため、アプリケーションが正しくレンダリングされるようにします。
1 つのフォームの元のフォントを保持するには、既定のフォントを 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 フォーム
影響を受ける API
何一つ。
FolderBrowserDialog の最新化
FolderBrowserDialog コントロールは、.NET Core 用の Windows フォーム アプリケーションで変更されました。
説明の変更
.NET Framework では、Windows フォームでは、FolderBrowserDialog コントロールに対して次のダイアログが使用されます。
.NET Framework で FolderBrowserDialogControl を
.NET Core 3.0 では、Windows フォームは Windows Vista で導入された新しい COM ベースのコントロールを使用します。
.NET Core での FolderBrowserDialogControl
導入されたバージョン
3.0
推奨されるアクション
ダイアログは自動的にアップグレードされます。
元のダイアログを保持する場合は、次のコード フラグメントに示すように、ダイアログを表示する前に、FolderBrowserDialog.AutoUpgradeEnabled プロパティを false
に設定します。
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
カテゴリ
Windows フォーム
影響を受ける API
SerializableAttribute が一部の Windows フォームの種類から削除されました
SerializableAttribute は、既知のバイナリ シリアル化シナリオがない一部の Windows フォーム クラスから削除されました。
説明の変更
次の型は、.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 フォーム
影響を受ける API
- None
AllowUpdateChildControlIndexForTabControls の互換性スイッチはサポートされていません
Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
互換性スイッチは、.NET Framework 4.6 以降のバージョンの Windows フォームでサポートされていますが、.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 フォーム
影響を受ける API
- None
DomainUpDown.UseLegacyScrolling 互換性スイッチはサポートされていません
.NET Framework 4.7.1 で導入された Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
互換性スイッチは、.NET Core または .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.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 フォーム
影響を受ける API
DoNotLoadLatestRichEditControl 互換性スイッチがサポートされていません
.NET Framework 4.7.1 で導入された Switch.System.Windows.Forms.UseLegacyImages
互換性スイッチは、.NET Core または .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.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 フォーム
影響を受ける API
DoNotSupportSelectAllShortcutInMultilineTextBox 互換性スイッチがサポートされない
.NET Framework 4.6.1 で導入された Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
互換性スイッチは、.NET Core および .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.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 フォーム
影響を受ける API
- None
DontSupportReentrantFilterMessage 互換性スイッチがサポートされていません
.NET Framework 4.6.1 で導入された Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
互換性スイッチは、.NET Core および .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.NET Framework 4.6.1 以降では、Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
互換性スイッチは、カスタム IMessageFilter.PreFilterMessage 実装で Application.FilterMessage メッセージが呼び出されたときに発生する可能性のある IndexOutOfRangeException 例外に対処します。 詳細については、「対策: Custom IMessageFilter.PreFilterMessage 実装」を参照してください。
.NET Core および .NET 5.0 以降では、Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
スイッチはサポートされていません。
導入されたバージョン
3.0
推奨されるアクション
スイッチを取り外します。 スイッチはサポートされておらず、代替機能は使用できません。
カテゴリ
Windows フォーム
影響を受ける API
EnableVisualStyleValidation 互換性スイッチはサポートされていません
Switch.System.Windows.Forms.EnableVisualStyleValidation
互換性スイッチは、.NET Core または .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.NET Framework では、Switch.System.Windows.Forms.EnableVisualStyleValidation
互換性スイッチを使用すると、アプリケーションは数値形式で指定されたビジュアル スタイルの検証をオプトアウトできます。
.NET Core および .NET 5.0 以降では、Switch.System.Windows.Forms.EnableVisualStyleValidation
スイッチはサポートされていません。
導入されたバージョン
3.0
推奨されるアクション
スイッチを取り外します。 スイッチはサポートされておらず、代替機能は使用できません。
カテゴリ
Windows フォーム
影響を受ける API
- None
UseLegacyContextMenuStripSourceControlValue 互換性スイッチはサポートされていません
.NET Framework 4.7.2 で導入された Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
互換性スイッチは、.NET Core または .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.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 フォーム
影響を受ける API
UseLegacyImages 互換性スイッチはサポートされていません
.NET Framework 4.8 で導入された Switch.System.Windows.Forms.UseLegacyImages
互換性スイッチは、.NET Core または .NET 5.0 以降の Windows フォームではサポートされていません。
説明の変更
.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 フォーム
影響を受ける API
- None
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 Basic Windows フォーム アプリ用の Visual Studio の 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
None
関連項目
.NET