Sdílet prostřednictvím


Zásadní změny ve Windows Forms pro .NET Core 3.0 a 3.1

Podpora modelu Windows Forms byla přidána do .NET Core ve verzi 3.0. Tento článek uvádí zásadní změny pro Windows Forms podle verze .NET, ve které byly zavedeny. Pokud upgradujete aplikaci Windows Forms z rozhraní .NET Framework nebo z předchozí verze .NET Core (3.0 nebo novější), tento článek se vás týká.

Na této stránce jsou popsané následující zásadní změny:

Změna způsobující chybu Zavedená verze
odebrané ovládací prvky 3.1
událost CellFormatting se nevyvolá, pokud se zobrazí popis 3.1
Control.DefaultFont se změnil na Segoe UI 9 pt 3.0
Modernizace Dialogu pro Výběr Složky 3.0
SerializableAttribute odebrán z některých typů Windows Forms 3.0
Přepínač kompatibility AllowUpdateChildControlIndexForTabControls není podporován 3.0
Přepínač kompatibility DomainUpDown.UseLegacyScrolling se nepodporuje 3.0
přepínač kompatibility DoNotLoadLatestRichEditControl se nepodporuje 3.0
Přepínač pro kompatibilitu DoNotSupportSelectAllShortcutInMultilineTextBox není podporován 3.0
Přepínač kompatibility se nepodporuje pro DontSupportReentrantFilterMessage 3.0
Přepínač kompatibility EnableVisualStyleValidation není podporován 3.0
Přepínač kompatibility UseLegacyContextMenuStripSourceControlValue není podporován 3.0
Přepínač kompatibility UseLegacyImages se nepodporuje 3.0
šablony About a SplashScreen nefungují pro Visual Basic 3.0

.NET Core 3.1

Odebrané ovládací prvky

Počínaje verzí .NET Core 3.1 už některé ovládací prvky Windows Forms nejsou k dispozici.

Změnit popis

Od verze .NET Core 3.1 už nejsou k dispozici různé ovládací prvky Windows Forms. V rozhraní .NET Framework 2.0 byly zavedeny náhradní ovládací prvky, které mají lepší návrh a podporu. Zastaralé ovládací prvky byly dříve odebrány z nástrojů návrháře, ale byly stále k dispozici k použití.

Následující typy už nejsou k dispozici:

Představená verze

3.1

Každý odebraný ovládací prvek má doporučený náhradní ovládací prvek. Projděte si následující tabulku:

Odebrání ovládacího prvku (API) Doporučená náhrada Přidružená rozhraní API, která se odeberou
Kontextové menu ContextMenuStrip
DataGrid Tabulkové zobrazení dat DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Hlavní nabídka MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu KolekcePoložekMenu
MenuItem ToolStripMenuItem
Panel nástrojů ToolStrip Vzhled nástrojové lišty
tlačítko na panelu nástrojů ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Kategorie

Windows Forms

Ovlivněná rozhraní API


Událost CellFormatting se nevyvolá, pokud je zobrazen tooltip.

DataGridView teď zobrazuje text buňky a popisy chyb při najetí myší a při výběru pomocí klávesnice. Pokud se zobrazí popis, událost DataGridView.CellFormatting se nevyvolá.

Změnit popis

Před .NET Core 3.1 DataGridView, který měl vlastnost ShowCellToolTips nastavenou na true, zobrazil textový rámeček s textem buňky a chybami, když byla buňka přejeta myší. Popisy se nezobrazily, když byla buňka vybrána pomocí klávesnice (například použitím klávesy Tab, klávesových zkratek nebo navigace pomocí šipek). Pokud uživatel upravil buňku a potom, zatímco DataGridView byl stále v režimu úprav, najedl myší na buňku, která nemá nastavenou vlastnost ToolTipText, byla vyvolána událost CellFormatting pro formátování textu buňky pro zobrazení v buňce.

Aby byly splněny standardy přístupnosti, od .NET Core 3.1 zobrazí DataGridView, která má vlastnost ShowCellToolTips nastavenou na true, nápovědy pro text a chyby buňky nejen tehdy, když je na buňku najeto myší, ale také když je vybraná pomocí klávesnice. V důsledku této změny není událost CellFormatting vyvolána, když je DataGridView v režimu úprav a jsou najeté myší buňky, které nemají nastavenou vlastnost ToolTipText. Událost není vyvolána, protože obsah najeté buňky se místo zobrazení v buňce zobrazí jako popis.

Představená verze

3.1

Refaktorovat jakýkoli kód, který závisí na události CellFormatting, zatímco DataGridView je v režimu úprav.

Kategorie

Windows Forms

Ovlivněná rozhraní API

Žádný


.NET Core 3.0

Výchozí písmo ovládacího prvku se změnilo na Segoe UI 9 pt

Změnit popis

V rozhraní .NET Framework byla vlastnost Control.DefaultFont nastavena na Microsoft Sans Serif 8.25 pt. Následující obrázek znázorňuje okno, které používá výchozí písmo.

výchozí písmo ovládacího prvku v rozhraní .NET Framework

Počínaje verzí .NET Core 3.0 je výchozí písmo nastaveno na Segoe UI 9 pt (stejné písmo jako SystemFonts.MessageBoxFont). V důsledku této změny mají formuláře a ovládací prvky velikost přibližně 27% větší, aby zohlednily větší velikost nového výchozího písma. Například:

výchozí písmo ovládacího prvku v .NET Core

Tato změna byla provedena v souladu s pokyny pro uživatelské prostředí windows (UX).

Zavedená verze

3.0

Vzhledem ke změně velikosti formulářů a ovládacích prvků se ujistěte, že se aplikace správně vykresluje.

Chcete-li zachovat původní písmo pro jeden formulář, nastavte jeho výchozí písmo na Microsoft Sans Serif 8.25 pt. Například:

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

Nebo můžete změnit výchozí písmo pro celou aplikaci některým z následujících způsobů:

  • Nastavením vlastnosti ApplicationDefaultFont MSBuild na "Microsoft Sans Serif, 8.25pt". Toto je upřednostňovaná technika, protože umožňuje Visual Studio používat nová nastavení v návrhovém režimu.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Voláním 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());
        }
    }
    

Kategorie

  • Windows Forms

Ovlivněná rozhraní API

Žádný.


Modernizace složkyBrowserDialog

Ovládací prvek FolderBrowserDialog se v aplikacích Windows Forms pro .NET Core změnil.

Změnit popis

V rozhraní .NET Framework používá formuláře Windows pro ovládací prvek FolderBrowserDialog následující dialogové okno:

FolderBrowserDialogControl v rozhraní .NET Framework

V rozhraní .NET Core 3.0 používá Windows Forms novější ovládací prvek založený na modelu COM, který byl zaveden v systému Windows Vista:

FolderBrowserDialogControl v .NET Core

Zavedená verze

3.0

Dialogové okno se automaticky upgraduje.

Pokud chcete zachovat původní dialogové okno, nastavte vlastnost FolderBrowserDialog.AutoUpgradeEnabled na false před zobrazením dialogového okna, jak je znázorněno v následujícím fragmentu kódu:

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

Kategorie

Windows Forms

Ovlivněná rozhraní API


SerializableAttribute odebrán z některých typů Windows Forms

SerializableAttribute byl odebrán z některých tříd Modelu Windows Forms, které nemají žádné známé scénáře binární serializace.

Změnit popis

Následující typy jsou zdobeny SerializableAttribute v rozhraní .NET Framework, ale atribut byl odebrán v .NET Core:

Tento mechanismus serializace má v minulosti vážné obavy ohledně údržby a zabezpečení. Udržování SerializableAttribute u typů znamená, že tyto typy musí být testovány na změny serializace verze na verzi a potenciálně změny serializace rámce na rámec. To znesnadňuje vývoj těchto typů a může být nákladný na údržbu. Tyto typy nemají žádné známé scénáře binární serializace, které minimalizují dopad odebrání atributu.

Další informace viz „binární serializace“.

Představená verze

3.0

Aktualizujte veškerý kód, který může záviset na těchto typech, které jsou označené jako serializovatelné.

Kategorie

Windows Forms

Ovlivněná rozhraní API

  • Žádný

Přepínač kompatibility AllowUpdateChildControlIndexForTabControls není podporován.

Přepínač kompatibility Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls je podporován ve Windows Forms v rozhraní .NET Framework 4.6 a novějších verzích, ale nepodporuje se v .NET Core nebo .NET 5.0 a novějších verzích.

Změnit popis

V rozhraní .NET Framework verze 4.6 a novějších při výběru záložky se změní pořadí její kolekce ovládacích prvků. Přepínač kompatibility Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls umožňuje aplikaci toto přeuspořádání přeskočit, pokud je toto chování nežádoucí.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls nepodporuje.

Zavedená verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API

  • Žádný

Přepínač kompatibility DomainUpDown.UseLegacyScrolling se nepodporuje.

Přepínač kompatibility Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, který byl zaveden v rozhraní .NET Framework 4.7.1, není ve Windows Forms v .NET Core nebo .NET 5.0 a novějším podporován.

Změnit popis

Počínaje rozhraním .NET Framework 4.7.1 umožňuje přechod na kompatibilitu Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling vývojářům vyjádřit nesouhlas s nezávislými DomainUpDown.DownButton() a DomainUpDown.UpButton() akcemi. Přepínač obnovil starší verzi chování, ve kterém se DomainUpDown.UpButton() ignoruje, pokud je kontextový text k dispozici, a vývojář musí použít DomainUpDown.DownButton() akci ovládacího prvku před akcí DomainUpDown.UpButton(). Další informace naleznete v sekci <AppContextSwitchOverrides> element.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling nepodporuje.

Představená verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API


Nepodporovaný přepínač kompatibility DoNotLoadLatestRichEditControl

Přepínač kompatibility Switch.System.Windows.Forms.UseLegacyImages, který byl zaveden v rozhraní .NET Framework 4.7.1, není ve Windows Forms v .NET Core nebo .NET 5.0 a novějším podporován.

Změnit popis

V rozhraní .NET Framework 4.6.2 a předchozích verzích vytvoří ovládací prvek RichTextBox instanci ovládacího prvku Win32 RichEdit verze 3.0 a pro aplikace, které cílí na rozhraní .NET Framework 4.7.1, RichTextBox ovládací prvek vytvoří instanci RichEdit v4.1 (v msftedit.dll). Přepínač kompatibility Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl byl zaveden tak, aby umožňoval aplikacím, které cílí na rozhraní .NET Framework 4.7.1 a novější verze, aby se odhlásily z nového ovládacího prvku RichEdit v4.1 a místo toho používaly starý ovládací prvek RichEdit v3.

V .NET Core a .NET 5.0 a novějších verzích se přepínač Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl nepodporuje. Podporují se jenom nové verze ovládacího prvku RichTextBox.

Představená verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API


Nepodporovaný přepínač kompatibility DoNotSupportSelectAllShortcutInMultilineTextBox není podporován

Přepínač kompatibility Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, který byl zaveden v rozhraní .NET Framework 4.6.1, není ve Windows Forms v .NET Core a .NET 5.0 a novějších podporovaný.

Změnit popis

Počínaje rozhraním .NET Framework 4.6.1 použijete-li klávesovou zkratku Ctrl + A v ovládacím prvku TextBox, je vybrán všechen text. V rozhraní .NET Framework 4.6 a předchozích verzích při použití klávesové zkratky Ctrl + A se nepodařilo vybrat veškerý text, pokud byly vlastnosti Textbox.ShortcutsEnabled a TextBox.Multiline nastaveny na true. Přepínač kompatibility Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox byl zaveden v rozhraní .NET Framework 4.6.1, aby se zachovalo původní chování. Další informace naleznete v tématu TextBox.ProcessCmdKey.

V .NET Core a .NET 5.0 a novějších verzích se přepínač Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox nepodporuje.

Verze představená

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API

  • Žádný

Přepínač kompatibility pro DontSupportReentrantFilterMessage není podporován.

Přepínač kompatibility Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, který byl zaveden v rozhraní .NET Framework 4.6.1, není ve Windows Forms v .NET Core a .NET 5.0 a novějších podporovaný.

Změnit popis

Počínaje rozhraním .NET Framework 4.6.1 řeší přepínač kompatibility Switch.System.Windows.Forms.DontSupportReentrantFilterMessage možné výjimky IndexOutOfRangeException při zavolání zprávy Application.FilterMessage s vlastní implementací IMessageFilter.PreFilterMessage. Pro více informací viz Mitigation: Implementace vlastního IMessageFilter.PreFilterMessage.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.DontSupportReentrantFilterMessage nepodporuje.

Zavedená verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API


Přepínač kompatibility EnableVisualStyleValidation není podporován.

Přepínač kompatibility Switch.System.Windows.Forms.EnableVisualStyleValidation není ve Windows Forms v .NET Core nebo .NET 5.0 a novějších podporovaný.

Změnit popis

V rozhraní .NET Framework přepínač kompatibility Switch.System.Windows.Forms.EnableVisualStyleValidation povolil aplikaci vyjádřit nesouhlas s ověřováním vizuálních stylů zadaných v číselném formátu.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.EnableVisualStyleValidation nepodporuje.

Zavedená verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API

  • Žádný

Kompatibilita přepínače UseLegacyContextMenuStripSourceControlValue není podporována.

Přepínač kompatibility Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, který byl zaveden v rozhraní .NET Framework 4.7.2, není ve Windows Forms v .NET Core nebo .NET 5.0 a novějších podporovaný.

Změnit popis

Počínaje rozhraním .NET Framework 4.7.2 umožňuje přepínač kompatibility Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue vývojáři vyjádřit nesouhlas s novým chováním vlastnosti ContextMenuStrip.SourceControl, která nyní vrací odkaz na správu zdrojového kódu. Předchozí chování této vlastnosti bylo vrátit null. Další informace naleznete v tématu <AppContextSwitchOverrides> element.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue nepodporuje.

Verze byla představena

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API


Přepínač kompatibility UseLegacyImages se nepodporuje.

Přepínač kompatibility Switch.System.Windows.Forms.UseLegacyImages, který byl zaveden v rozhraní .NET Framework 4.8, není ve Windows Forms v .NET Core nebo .NET 5.0 a novějších podporovaný.

Změnit popis

Počínaje rozhraním .NET Framework 4.8 vyřešil přepínač kompatibility Switch.System.Windows.Forms.UseLegacyImages možné problémy se škálováním obrázků ve scénářích ClickOnce v prostředích s vysokým rozlišením DPI. Pokud je nastavená hodnota true, přepínač umožňuje uživateli obnovit starší měřítko obrázků na displejích s vysokým rozlišením DPI, jejichž měřítko je nastaveno na více než 100%. Další informace najdete v zprávě k vydání verze rozhraní .NET Framework 4.8 na GitHubu.

V .NET Core a .NET 5.0 a novějších se přepínač Switch.System.Windows.Forms.UseLegacyImages nepodporuje.

Nová verze

3.0

Odeberte přepínač. Přepínač není podporovaný a není k dispozici žádná alternativní funkce.

Kategorie

Windows Forms

Ovlivněná rozhraní API

  • Žádný

Šablony About a SplashScreen jsou poškozené

Soubory About.vb a SplashScreen.vb vygenerované sadou Visual Studio obsahují odkazy na typy v oboru názvů My, které nejsou k dispozici .NET Core 3.0 a 3.1.

Představená verze

3.0

Změnit popis

.NET Core 3.0 a 3.1 neobsahují úplnou podporu visual basicu My. Referenční vlastnosti o a šablonách formulářů Úvodní obrazovka v sadě Visual Studio pro Visual Basic pro aplikace Windows Forms v typu, které nejsou dostupné.

Podpora My jazyka Visual Basic byla vylepšena v .NET 5, upgradujte projekt na .NET 5 nebo novější.

-nebo-

Opravte chyby kompilátoru v typech About a SplashScreen ve vaší aplikaci. Pomocí třídy System.Reflection.Assembly získejte informace poskytované typem My.Application.Info. Tady je k dispozici přímý port obou formulářů.

Spropitné

Toto je ukázkový kód a neoptimalizovaný. Seznam atributů by se měl ukládat do mezipaměti, aby se zkrátila doba načítání formuláře.

o

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

úvodní obrazovka

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

Kategorie

Visual Basic Windows Forms

Ovlivněná rozhraní API

Žádný


Viz také