Udostępnij przez


Co nowego w formularzach systemu Windows dla platformy .NET 7

W tym artykule opisano niektóre nowe funkcje i ulepszenia systemu Windows Forms na platformie .NET 7.

Podczas migracji z platformy .NET Framework do .NET 7 należy pamiętać o kilku zmianach łamiących kompatybilność. Aby uzyskać więcej informacji, zobacz Łamiące zmiany w Windows Forms.

Ulepszenia wysokiej rozdzielczości DPI

Ulepszono renderowanie PerMonitorV2 o wysokim DPI:

  • Poprawnie skaluj zagnieżdżone kontrolki. Na przykład przycisk znajdujący się w panelu, który jest umieszczony na karcie zakładki.

  • Skaluj właściwości Form.MaximumSize i Form.MinimumSize w oparciu o bieżące ustawienia DPI monitora dla aplikacji, które działają z ApplicationHighDpiMode ustawionym na PerMonitorV2.

    W programie .NET 7 ta funkcja jest domyślnie wyłączona i musisz wyrazić zgodę na otrzymywanie tej zmiany. Począwszy od platformy .NET 8, ta funkcja jest domyślnie włączona i musisz zrezygnować z niej, aby powrócić do poprzedniego zachowania.

    Aby włączyć funkcję, skonfiguruj ustawienie configProperties w pliku runtimeconfig.json:

    {
      "runtimeOptions": {
        "tfm": "net7.0",
        "frameworks": [
            ...
        ],
        "configProperties": {
          "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true,
        }
      }
    }
    

Ulepszenia i poprawki ułatwień dostępu

W tej wersji dodano dalsze ulepszenia ułatwień dostępu, w tym między innymi następujące elementy:

  • Rozwiązano wiele problemów związanych z komunikatami obserwowanymi w czytnikach ekranu, zapewniając poprawność informacji o kontrolkach. Na przykład ListView teraz poprawnie informuje, kiedy grupa jest rozwinięta lub zwinięta.

  • Więcej kontrolek teraz zapewnia obsługę Automatyzacji Interfejsu Użytkownika.

  • Naprawiono przecieki pamięci związane z uruchamianiem aplikacji Windows Forms w narzędziach pomocniczych, takich jak Narrator.

  • Narzędzia pomocnicze dokładnie rysują wskaźniki fokusu i zgłaszają poprawne prostokąty obramowania dla zagnieżdżonych formularzy i niektórych elementów kontrolek złożonych, takich jak DataGridView, ListView i TabControl.

  • Interfejs użytkownika automatyzacji z wdrożonym poprawnie wzorcem kontrolki Rozwiń/Zwiń został zastosowany w kontrolkach , ListView i TreeView, i aktywuje się tylko dla elementów, które można rozwinąć.

  • Różne poprawki współczynnika kontrastu kolorów w kontrolkach.

  • Ulepszenia widoczności dla ToolStripTextBox i ToolStripButton w motywach o wysokim kontraście.

Ulepszenia powiązań danych (wersja zapoznawcza)

Chociaż formularze systemu Windows mają już zaawansowany aparat powiązań, wprowadzana jest bardziej nowoczesna forma powiązania danych, podobna do powiązania danych dostarczonego przez WPF.

Nowe funkcje powiązania danych umożliwiają pełne wykorzystanie wzorca MVVM i użycie maperów relacyjnych obiektów z modelu ViewModels w formularzach systemu Windows łatwiejsze niż wcześniej. To z kolei umożliwia zmniejszenie liczby kodu w plikach code-behind i otwiera nowe możliwości testowania. Co ważniejsze, umożliwia udostępnianie kodu między formularzami systemu Windows i innymi platformami graficznymi .NET, takimi jak WPF, UWP/WinUI i .NET MAUI. I aby wyjaśnić często zadawane pytanie, nie ma żadnych planów wprowadzenia XAML w formularzach Windows Forms.

Te nowe funkcje powiązania danych są dostępne w wersji zapoznawczej dla platformy .NET 7, a więcej pracy nad tą funkcją nastąpi na platformie .NET 8.

Aby włączyć nowe powiązanie, dodaj EnablePreviewFeatures ustawienie do pliku projektu. Jest to obsługiwane zarówno w językach C#, jak i Visual Basic.

<Project Sdk="Microsoft.NET.Sdk">

  <!-- other settings -->

  <PropertyGroup>
    <EnablePreviewFeatures>true</EnablePreviewFeatures>
  </PropertyGroup>

</Project>

Poniższy fragment kodu przedstawia nowe właściwości, zdarzenia i metody dodane do różnych klas w formularzach Windows Forms. Mimo że poniższy przykład kodu znajduje się w języku C#, dotyczy również języka Visual Basic.

public class Control  {
    [BindableAttribute(true)]
    public virtual object DataContext { get; set; }
    [BrowsableAttribute(true)]
    public event EventHandler DataContextChanged;
    protected virtual void OnDataContextChanged(EventArgs e);
    protected virtual void OnParentDataContextChanged(EventArgs e);
}

[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
    protected BindableComponent();
    public BindingContext? BindingContext { get; set; }
    public ControlBindingsCollection DataBindings { get; }
    public event EventHandler BindingContextChanged;
    protected virtual void OnBindingContextChanged(EventArgs e);
}

public abstract class ButtonBase : Control {
    [BindableAttribute(true)]
    [RequiresPreviewFeaturesAttribute]
    public ICommand? Command { get; set; }
    [BindableAttribute(true)]
    public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandCanExecuteChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandParameterChanged;
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandCanExecuteChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandParameterChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnRequestCommandExecute(EventArgs e);
}

public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
    [BindableAttribute(true)]
    [RequiresPreviewFeaturesAttribute]
    public ICommand Command { get; set; }
    [BindableAttribute(true)]
    public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandCanExecuteChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandParameterChanged;
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandCanExecuteChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandParameterChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnRequestCommandExecute(EventArgs e);
}

Różne ulepszenia

Poniżej przedstawiono inne istotne zmiany:

  • Obsługa przeciągania i upuszczania jest zgodna z funkcją przeciągania i upuszczania systemu Windows z bogatszymi efektami wyświetlania, takimi jak ikony i etykiety tekstu.
  • Okna dialogowe folderów i plików umożliwiają uzyskanie większej liczby opcji:
    • Dodaj do ostatnich
    • Sprawdź dostęp do zapisu
    • Tryb rozwinięty
    • Ok wymaga interakcji
    • Wybierz tylko do odczytu
    • Pokaż ukryte pliki
    • Pokaż przypięte miejsca
    • Pokaż podgląd
  • ErrorProvider ma właściwość HasErrors teraz.
  • Układ przyciągania formularza jest stały dla systemu Windows 11.

Zobacz także