.NET Core 3.0 および 3.1 における Windows フォームでの破壊的変更

Windows フォームのサポートは、.NET Core にバージョン 3.0 で追加されました。 この記事では、Windows フォームの破壊的変更を、導入された .NET のバージョン別に説明します。 この記事は、.NET Framework または以前のバージョンの .NET Core (3.0 以降) から Windows フォーム アプリをアップグレードするユーザーを対象としています。

このページでは、次の破壊的変更について説明します。

互換性に影響する変更点 導入されたバージョン
削除されたコントロール 3.1
ヒントが表示されていると CellFormatting が発生しない 3.1
Control.DefaultFont を Segoe UI 9 pt に変更 3.0
FolderBrowserDialog の最新化 3.0
一部の Windows フォーム型から 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 フォーム コントロールが利用できません。

変更の説明

.NET Core 3.1 より、さまざまな Windows フォーム コントロールが利用できなくなっています。 デザインとサポートが改善された代替コントロールは .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 フォーム

影響を受ける API


ヒントが表示されていると 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

なし


.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

フォームとコントロールのサイズが変更されているため、レンダリングがご使用のアプリケーションで正しく行われることを確認してください。

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 では削除されています。

従来、このシリアル化メカニズムには、メンテナンスとセキュリティに関して重大な問題がありました。 型の SerializableAttribute を維持するということは、それらの型ではバージョン間でシリアル化の変更をテストする必要があることを意味し、場合にっよってはフレームワーク間でも必要です。 これにより、それらの型を進化させることが難しくなり、保守コストが高くなる可能性があります。 これらの型には既知のバイナリ シリアル化のシナリオがないため、属性を削除しても影響は最小限です。

詳細については、「バイナリ シリアル化」を参照してください。

導入されたバージョン

3.0

これらの型に依存する可能性のあるすべてのコードを、シリアル化可能としてマークするように更新します。

カテゴリ

Windows フォーム

影響を受ける API

  • なし

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

  • なし

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 およびそれ以前のバージョンでは、Textbox.ShortcutsEnabled および TextBox.Multiline プロパティが true に選択されていた場合、Ctrl + A ショートカット キーを選択してもすべてのテキストが選択されませんでした。 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

  • なし

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 実装で IndexOutOfRangeException メッセージが呼び出されたときに発生する可能性がある Application.FilterMessage 例外に対処します。 詳細については、「軽減策: カスタムの 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

  • なし

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

  • なし

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 フォーム

影響を受ける API

なし


関連項目