Condividi tramite


Cambiamenti dirompenti in Windows Forms per .NET Core 3.0 e 3.1

Il supporto di Windows Form è 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 stai 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 a te.

Le modifiche di rilievo seguenti sono documentate in questa pagina:

Modifica che causa un'interruzione Versione introdotta
Controlli rimossi 3.1
l'evento CellFormatting non viene attivato se viene visualizzata la descrizione comando 3.1
Control.DefaultFont è stato modificato in Segoe UI 9 pt 3.0
Modernizzazione del FolderBrowserDialog 3.0
SerializableAttribute rimosso da alcuni tipi di Windows Forms 3.0
Compatibilità dell'opzione AllowUpdateChildControlIndexForTabControls non supportata 3.0
L'opzione di compatibilità DomainUpDown.UseLegacyScrolling non è supportata 3.0
interruttore di compatibilità DoNotLoadLatestRichEditControl non supportato 3.0
interruttore di compatibilità DoNotSupportSelectAllShortcutInMultilineTextBox non supportato 3.0
opzione di compatibilità DontSupportReentrantFilterMessage non supportata 3.0
Interruttore di compatibilità EnableVisualStyleValidation non supportato 3.0
opzione di comando di compatibilità UseLegacyContextMenuStripSourceControlValue non supportata 3.0
interruttore di compatibilità UseLegacyImages non supportato 3.0
i modelli di About e SplashScreen non funzionano per Visual Basic 3.0

.NET Core 3.1

Controlli rimossi

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

Modificare la descrizione

A partire da .NET Core 3.1, i vari controlli Windows Form non sono più disponibili. I controlli di sostituzione 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 introdotta

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
MenuPrincipale MenuStrip
Menù ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
Voce di menu ToolStripMenuItem
Barra degli strumenti Barra degli strumenti Aspetto della Barra degli Strumenti
Pulsante della Barra degli Strumenti ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Categoria

Windows Forms

API interessate


Evento CellFormatting non generato se viene visualizzato il tooltip.

Un DataGridView ora mostra il testo e i tooltip di errore di una cella quando viene passata con il mouse e quando viene selezionata tramite la tastiera. Se viene visualizzata una descrizione comando, l'evento DataGridView.CellFormatting non viene generato.

Modificare la descrizione

Prima di .NET Core 3.1, un DataGridView con la proprietà ShowCellToolTips impostata su true mostrava una descrizione comando per il testo e gli errori di una cella quando il mouse passava sopra la cella. Le descrizioni comandi non venivano visualizzate quando veniva selezionata una cella tramite tastiera, ad esempio utilizzando il tasto Tab, i tasti di scelta rapida o i tasti freccia. Se l'utente ha modificato una cella e quindi, mentre il DataGridView era ancora in fase di modifica, ha passato il cursore su una cella che non aveva impostata la proprietà ToolTipText, è stato generato un evento CellFormatting per formattare il testo della cella per la visualizzazione.

Per soddisfare gli standard di accessibilità, a partire da .NET Core 3.1, un DataGridView con la proprietà ShowCellToolTips impostata su true mostra le descrizioni comando per il testo e gli errori di una cella non solo quando la cella viene spostata al passaggio del mouse, ma anche quando viene selezionata tramite la tastiera. Come conseguenza di questa modifica, l'evento CellFormatting viene non generato quando le celle che non dispongono della proprietà ToolTipText sono evidenziate al passaggio del mouse mentre DataGridView è in modalità modifica. L'evento non si attiva perché il contenuto della cella su cui si passa il mouse viene mostrato come tool-tip invece di essere visualizzato nella cella.

Versione introdotta

3.1

Rifattorizza il codice che dipende dall'evento CellFormatting mentre l'evento DataGridView è in modalità di modifica.

Categoria

Windows Forms

API interessate

Nessuno


.NET Core 3.0

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

Modificare la descrizione

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.

Tipo di carattere controllo predefinito in .NET Framework

A partire da .NET Core 3.0, il tipo di carattere predefinito è impostato su Segoe UI 9 pt (lo stesso tipo di carattere di SystemFonts.MessageBoxFont). In seguito a questa modifica, i moduli e i controlli vengono ingranditi di circa 27 unità% per adeguarsi alle dimensioni maggiori del nuovo font predefinito. Per esempio:

Carattere di controllo predefinito in .NET Core

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

Versione introdotta

3.0

Assicurarsi che l'applicazione venga visualizzata correttamente a causa della modifica delle dimensioni dei moduli e dei controlli.

Per mantenere il tipo di carattere originale per un singolo modulo, impostarne il tipo di carattere predefinito su Microsoft Sans Serif 8.25 pt. Per esempio:

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

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

  • Impostando la proprietà ApplicationDefaultFont MSBuild 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>
    
  • 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

  • Windows Forms

API interessate

Nessuno.


Modernizzazione di FolderBrowserDialog

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

Modificare la descrizione

In .NET Framework Windows Form usa la finestra di dialogo seguente per il controllo FolderBrowserDialog:

Il controllo FolderBrowserDialog nel .NET Framework

In .NET Core 3.0 Windows Form 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 desidera mantenere la finestra di dialogo originale, impostare la proprietà FolderBrowserDialog.AutoUpgradeEnabled su false prima di visualizzare il dialogo, come illustrato nel frammento di codice seguente:

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

Categoria

Windows Forms

API interessate


SerializableAttribute rimosso da alcuni tipi di Windows Forms

Il SerializableAttribute è stato rimosso da alcune classi di Windows Form che non hanno scenari di serializzazione binari noti.

Modificare la descrizione

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

Storicamente, questo meccanismo di serializzazione ha avuto 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 modifiche alla serializzazione da framework a framework. In questo modo è più difficile evolvere tali tipi e può essere costoso da gestire. Questi tipi non hanno scenari di serializzazione binari noti, riducendo al minimo l'impatto della rimozione dell'attributo.

Per ulteriori informazioni, vedere Serializzazione Binaria.

Versione introdotta

3.0

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

Categoria

Windows Forms

API interessate

  • Nessuno

Opzione di compatibilità AllowUpdateChildControlIndexForTabControls non supportata

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

Modificare la descrizione

In .NET Framework 4.6 e versioni successive selezionare 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 introdotta

3.0

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

Categoria

Windows Forms

API interessate

  • Nessuno

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 Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

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

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

Versione introdotta

3.0

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

Categoria

Windows Forms

API interessate


Interruttore di compatibilità "DoNotLoadLatestRichEditControl" non supportato

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

Modificare la descrizione

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). Il commutatore di compatibilità Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl è stato introdotto 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 vecchio controllo RichEdit v3.

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 introdotta

3.0

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

Categoria

Windows Forms

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 Form in .NET Core e .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.6.1, selezionando il tasto di scelta rapida CTRL + A in un controllo TextBox, veniva selezionato tutto il testo. In .NET Framework 4.6 e versioni precedenti, selezionando il CTRL + Tasto di scelta rapida non è riuscito a selezionare tutto il testo se la Textbox.ShortcutsEnabled e le proprietà TextBox.Multiline sono entrambe impostate su true. Il commutatore di compatibilità Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox è stato introdotto 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 introdotta

3.0

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

Categoria

Windows Forms

API interessate

  • Nessuno

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 Form in .NET Core e .NET 5.0 e versioni successive.

Modificare la descrizione

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 ulteriori informazioni, vedere la sezione Mitigazione: Implementazioni personalizzate di IMessageFilter.PreFilterMessage.

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

Versione introdotta

3.0

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

Categoria

Windows Forms

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.

Modificare la descrizione

In .NET Framework, l'opzione di compatibilità Switch.System.Windows.Forms.EnableVisualStyleValidation ha consentito 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.

Introdotta versione

3.0

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

Categoria

Windows Forms

API interessate

  • Nessuno

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 Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

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à era quello di restituire null. Per altre informazioni, vedere <l'elemento appContextSwitchOverrides>.

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

Versione introdotta

3.0

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

Categoria

Windows Forms

API interessate


Interruttore di compatibilità UseLegacyImages non supportato

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

Modificare la descrizione

A partire da .NET Framework 4.8, il commutatore 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 impostato su true, l'interruttore consente all'utente di ripristinare il ridimensionamento delle immagini legacy su schermi DPI elevati la cui scala è impostata su un valore superiore al 100%. Per altre informazioni, vedere note sulla versione di .NET Framework 4.8 in GitHub.

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

Versione introdotta

3.0

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

Categoria

Windows Forms

API interessate

  • Nessuno

I modelli About e SplashScreen sono non funzionanti

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

Versione introdotta

3.0

Modificare la descrizione

.NET Core 3.0 e 3.1 non contengono il supporto completo di Visual Basic My. Le Informazioni su e modelli di modulo SplashScreen in Visual Studio per le app Windows Form di Visual Basic nel tipo di My.Application.Info non disponibili.

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

-o-

Correggi gli errori del compilatore nei tipi About e SplashScreen della tua app. Usare la classe System.Reflection.Assembly per ottenere le informazioni fornite dal tipo My.Application.Info. Qui è disponibile una porta dritta di entrambe le forme.

Mancia

Si tratta di codice di esempio e non ottimizzata. 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

Categoria

Forme Windows di Visual Basic

API interessate

Nessuno


Vedere anche