Condividi tramite


Modifiche di rilievo in Windows Forms per .NET Core 3.0 e 3.1

Il supporto di Windows Forms è stato aggiunto a .NET Core nella versione 3.0. Questo articolo elenca le modifiche di rilievo per Windows Form in base alla versione .NET in cui sono state introdotte. Se si sta aggiornando un'app Windows Forms da .NET Framework o da una versione precedente di .NET Core (3.0 o versione successiva), questo articolo si applica all'utente corrente.

Le seguenti modifiche che causano un’interruzione sono documentate in questa pagina:

Modifica Versione di introduzione
Controlli rimossi 3.1
Evento CellFormatting non generato se viene visualizzata la descrizione comando 3.1
Control.DefaultFont è stato modificato in Segoe UI 9 pt 3,0
Modernizzazione di FolderBrowserDialog 3,0
Classe SerializableAttribute rimossa da alcuni tipi di Windows Forms 3,0
Opzione di compatibilità AllowUpdateChildControlIndexForTabControls non supportata 3,0
Opzione di compatibilità DomainUpDown.UseLegacyScrolling non supportata 3,0
Opzione di compatibilità DoNotLoadLatestRichEditControl non supportata 3,0
Opzione di compatibilità DoNotSupportSelectAllShortcutInMultilineTextBox non supportata 3,0
Opzione di compatibilità DontSupportReentrantFilterMessage non supportata 3,0
Opzione di compatibilità EnableVisualStyleValidation non supportata 3,0
Opzione di compatibilità UseLegacyContextMenuStripSourceControlValue non supportata 3,0
Opzione di compatibilità UseLegacyImages non supportata 3,0
I modelli About e SplashScreen presentano interruzioni per Visual Basic 3,0

.NET Core 3.1

Controlli rimossi

A partire da .NET Core 3.1, alcuni controlli di Windows Forms non sono più disponibili.

Descrizione delle modifiche

A partire da .NET Core 3.1, diversi controlli di Windows Forms non sono più disponibili. I controlli sostitutivi con progettazione e supporto migliori sono stati introdotti in .NET Framework 2.0. I controlli deprecati sono stati rimossi in precedenza dalle caselle degli strumenti della finestra di progettazione, ma erano ancora disponibili per l'uso.

I tipi seguenti non sono più disponibili:

Versione di introduzione

3.1

Ogni controllo rimosso ha un controllo sostitutivo consigliato. Fare riferimento alla tabella seguente:

Controllo rimosso (API) Sostituzione consigliata API associate che vengono rimosse
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
MainMenu MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Category

WinForms

API interessate


Evento CellFormatting non generato se viene visualizzata la descrizione comando

Una classe DataGridView mostra ora il testo e le descrizioni comando di errore di una cella quando si passa il mouse sopra la cella e in caso di selezione tramite la tastiera. Se viene visualizzata una descrizione comando, l'evento DataGridView.CellFormatting non viene generato.

Descrizione delle modifiche

Prima di .NET Core 3.1, una classe DataGridView con la proprietà ShowCellToolTips impostata su true mostrava una descrizione comando per il testo e gli errori di una cella quando si passava il mouse sopra la cella. Le descrizioni comando non venivano visualizzate quando una cella veniva selezionata tramite la tastiera, ad esempio usando il tasto TAB, i tasti di scelta rapida o lo spostamento con la freccia. Se l'utente modificava una cella e quindi, mentre la classe DataGridView era ancora in modalità di modifica, passava il mouse sopra una cella per cui non era stata impostata la proprietà ToolTipText, veniva generato un evento CellFormatting per formattare il testo della cella per la visualizzazione nella cella.

Per soddisfare gli standard di accessibilità, a partire da .NET Core 3.1, una classe DataGridView con la proprietà ShowCellToolTips impostata su true mostra le descrizioni comando per il testo e gli errori di una cella non solo quando si passa il mouse sopra la cella , ma anche quando la cella viene selezionata tramite la tastiera. In seguito a questa modifica, l'evento CellFormatting non viene generato quando si passa il mouse sopra le celle per cui non è stata impostata la proprietà ToolTipText mentre DataGridView è in modalità di modifica. L'evento non viene generato perché il contenuto della cella su cui si passa il mouse viene visualizzato come descrizione comando anziché essere visualizzato nella cella.

Versione di introduzione

3.1

Effettuare il refactoring di qualsiasi codice che dipende dall'evento CellFormatting mentre DataGridView è in modalità di modifica.

Category

WinForms

API interessate

None


.NET Core 3.0

Il tipo di carattere del controllo predefinito è stato modificato in Segoe UI 9 pt

Descrizione delle modifiche

In .NET Framework la proprietà Control.DefaultFont è stata impostata su Microsoft Sans Serif 8.25 pt. L'immagine seguente mostra una finestra che usa il tipo di carattere predefinito.

Carattere di controllo predefinito in .NET Framework

A partire da .NET Core 3.0, il tipo di carattere predefinito è impostato su Segoe UI 9 pt, ovvero lo stesso tipo di carattere di SystemFonts.MessageBoxFont. In seguito a questa modifica, le dimensioni di moduli e controlli sono circa il 27% più grandi per tenere conto delle dimensioni maggiori del nuovo tipo di carattere predefinito. Ad esempio:

Carattere di controllo predefinito in .NET Core

Questa modifica è stata apportata per allinearsi alle Linee guida dell'esperienza utente di Windows.

Versione di introduzione

3,0

A causa della modifica delle dimensioni dei moduli e dei controlli, assicurarsi che il rendering dell'applicazione venga eseguito correttamente.

Per mantenere il carattere originale per un singolo modulo, impostarlo come predefinito su Microsoft Sans Serif 8.25 pt. Ad esempio:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

In alternativa, è possibile modificare carattere predefinito per un'intera applicazione in uno dei modi seguenti:

  • Impostando la proprietà di MSBuild ApplicationDefaultFont su “Microsoft Sans Serif, 8.25pt”. Questa è la tecnica preferita perché consente a Visual Studio di usare le nuove impostazioni nella finestra di progettazione.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Oppure chiamando 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());
        }
    }
    

Categoria

  • WinForms

API interessate

Nessuno.


Modernizzazione di FolderBrowserDialog

Il controllo FolderBrowserDialog è stato modificato nelle applicazioni Windows Forms per .NET Core.

Descrizione delle modifiche

Windows Forms in .NET Framework usa la finestra di dialogo seguente per il controllo FolderBrowserDialog:

FolderBrowserDialogControl in .NET Framework

Windows Forms in .NET Core 3.0 usa un controllo basato su COM più recente, introdotto in Windows Vista:

FolderBrowserDialogControl in .NET Core

Versione introdotta

3,0

La finestra di dialogo verrà aggiornata automaticamente.

Se si vuole mantenere la finestra di dialogo originale, impostare la proprietà FolderBrowserDialog.AutoUpgradeEnabled su false prima di visualizzare la finestra di dialogo, come illustrato dal frammento di codice seguente:

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

Category

WinForms

API interessate


Classe SerializableAttribute rimossa da alcuni tipi di Windows Forms

La classeSerializableAttribute è stata rimossa da alcune classi di Windows Forms che non hanno scenari di serializzazione binaria noti.

Descrizione delle modifiche

I tipi seguenti sono decorati con la classe SerializableAttribute in .NET Framework, ma l'attributo è stato rimosso in .NET Core:

Storicamente questo meccanismo di serializzazione ha comportato gravi problemi di manutenzione e sicurezza. La gestione di SerializableAttribute sui tipi significa che questi tipi devono essere testati per le modifiche di serializzazione da versione a versione e potenzialmente per le modifiche alla serializzazione da framework a framework. Risulta quindi più difficile evolvere tali tipi e la gestione può essere costosa. Questi tipi non hanno scenari di serializzazione binaria noti e ciò riduce al minimo l'impatto della rimozione dell'attributo.

Per altre informazioni, vedere Serializzazione binaria.

Versione di introduzione

3,0

Aggiornare qualsiasi codice che può dipendere da questi tipi contrassegnati come serializzabili.

Category

WinForms

API interessate

  • None

Opzione di compatibilità AllowUpdateChildControlIndexForTabControls non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls è supportata in Windows Forms in .NET Framework 4.6 e versioni successive, ma non è supportata in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

In .NET Framework 4.6 e versioni successive la selezione di una scheda riordina la raccolta di controlli. L'opzione di compatibilità Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls consente a un'applicazione di ignorare questo riordinamento quando questo comportamento è indesiderato.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate

  • None

Opzione di compatibilità DomainUpDown.UseLegacyScrolling non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, introdotta in .NET Framework 4.7.1, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

A partire da .NET Framework 4.7.1, l'opzione di compatibilità Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling consente agli sviluppatori di rifiutare esplicitamente le azioni indipendenti DomainUpDown.DownButton() e DomainUpDown.UpButton(). L'opzione ha ripristinato il comportamento legacy, in cui il metodo DomainUpDown.UpButton() viene ignorato se il testo del contesto è presente e lo sviluppatore deve usare l'azione DomainUpDown.DownButton() sul controllo prima dell'azione DomainUpDown.UpButton(). Per altre informazioni, vedere Elemento <AppContextSwitchOverrides>.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate


Opzione di compatibilità DoNotLoadLatestRichEditControl non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyImages, introdotta in .NET Framework 4.7.1, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

In .NET Framework 4.6.2 e versioni precedenti il controllo RichTextBox crea un'istanza del controllo RichEdit Win32 v3.0 e per le applicazioni destinate a .NET Framework 4.7.1 il controllo RichTextBox crea un'istanza di RichEdit v4.1 (in msftedit.dll). L'opzione di compatibilità Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl è stata introdotta per consentire alle applicazioni destinate a .NET Framework 4.7.1 e versioni successive di rifiutare esplicitamente il nuovo controllo RichEdit v4.1 e usare invece il controllo RichEdit v3 precedente.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl non è supportata. Sono supportate solo le nuove versioni del controllo RichTextBox.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate


Opzione di compatibilità DoNotSupportSelectAllShortcutInMultilineTextBox non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, introdotta in .NET Framework 4.6.1, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

A partire da .NET Framework 4.6.1, la selezione della combinazione di tasti CTRL + A in un controllo TextBox consente di selezionare tutto il testo. In .NET Framework 4.6 e versioni precedenti la selezione della combinazione di tasti CTRL + A non consentiva di selezionare tutto il testo se le proprietà Textbox.ShortcutsEnabled e TextBox.Multiline erano impostate su true. L'opzione di compatibilità Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox è stata introdotta in .NET Framework 4.6.1 per mantenere il comportamento originale. Per altre informazioni, vedere TextBox.ProcessCmdKey.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate

  • None

Opzione di compatibilità DontSupportReentrantFilterMessage non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, introdotta in .NET Framework 4.6.1, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

A partire da .NET Framework 4.6.1, l'opzione di compatibilità Switch.System.Windows.Forms.DontSupportReentrantFilterMessage risolve possibili eccezioni IndexOutOfRangeException quando viene chiamato il messaggio Application.FilterMessage con un'implementazione IMessageFilter.PreFilterMessage personalizzata. Per altre informazioni, vedere Mitigazione: Implementazioni IMessageFilter.PreFilterMessage personalizzate.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.DontSupportReentrantFilterMessage non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate


Opzione di compatibilità EnableVisualStyleValidation non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.EnableVisualStyleValidation non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

In .NET Framework l'opzione di compatibilità Switch.System.Windows.Forms.EnableVisualStyleValidation consentiva a un'applicazione di rifiutare esplicitamente la convalida degli stili di visualizzazione forniti in un formato numerico.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.EnableVisualStyleValidation non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate

  • None

Opzione di compatibilità UseLegacyContextMenuStripSourceControlValue non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, introdotta in .NET Framework 4.7.2, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

A partire da .NET Framework 4.7.2, l'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue consente allo sviluppatore di rifiutare esplicitamente il nuovo comportamento della proprietà ContextMenuStrip.SourceControl, che ora restituisce un riferimento al controllo del codice sorgente. Il comportamento precedente della proprietà consisteva nel restituire null. Per altre informazioni, vedere Elemento <AppContextSwitchOverrides>.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate


Opzione di compatibilità UseLegacyImages non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyImages, introdotta in .NET Framework 4.8, non è supportata in Windows Forms in .NET Core o .NET 5.0 e versioni successive.

Descrizione delle modifiche

A partire da .NET Framework 4.8, l'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyImages ha risolto i possibili problemi di ridimensionamento delle immagini negli scenari ClickOnce in ambienti con valori DPI elevati. Se impostata su true, l'opzione consente all'utente di ripristinare il ridimensionamento delle immagini legacy su schermi DPI elevati la cui scala è impostata su maggiore del 100%. Per altre informazioni, vedere le Note sulla versione di .NET Framework 4.8 su GitHub.

In .NET Core e .NET 5.0 e versioni successive l'opzione Switch.System.Windows.Forms.UseLegacyImages non è supportata.

Versione di introduzione

3,0

Rimuovere l'opzione. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Category

WinForms

API interessate

  • None

I modelli About e SplashScreen presentano interruzioni

I file About.vb e SplashScreen.vb generati da Visual Studio contengono riferimenti a tipi nello spazio dei nomi My che non sono disponibili .NET Core 3.0 e 3.1.

Versione di introduzione

3,0

Descrizione delle modifiche

.NET Core 3.0 e 3.1 non contengono il supporto My completo di Visual Basic. I modelli di modulo About e SplashScreen in Visual Studio per le app di Windows Forms per Visual Basic fanno riferimento a proprietà nel tipo My.Application.Info che non sono disponibili.

Il supporto My di Visual Basic è stato migliorato in .NET 5. Aggiornare il progetto a .NET 5 o versione successiva.

-o-

Correggere gli errori del compilatore nei tipi About e SplashScreen nell'app. Usare la classe System.Reflection.Assembly per ottenere le informazioni fornite dal tipo My.Application.Info. Qui è disponibile una semplice conversione di entrambi i moduli.

Suggerimento

Si tratta di codice di esempio e non ottimizzato. L'elenco degli attributi deve essere memorizzato nella cache per ridurre il tempo di caricamento dei moduli.

Informazioni su

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

Category

Windows Forms per Visual Basic

API interessate

None


Vedi anche