Новые возможности .NET 8 (Windows Forms .NET)

В этой статье описываются некоторые новые функции и усовершенствования Windows Forms в .NET 8.

При переходе с платформа .NET Framework на .NET 8 следует учитывать несколько критических изменений. Дополнительные сведения см. в разделе Критические изменения в Windows Forms.

Улучшения привязки данных

Новый модуль привязки данных был в предварительной версии с .NET 7 и теперь полностью включен в .NET 8. Хотя и не так широко, как существующий механизм привязки данных Windows Forms, этот новый механизм моделиируется после WPF, что упрощает реализацию принципов проектирования MVVM.

Расширенные возможности привязки данных упрощают использование шаблона MVVM и использования реляционных средств сопоставления объектов из ViewModels в Windows Forms. Это сокращает объем кода в файлах программной части. Кроме того, он обеспечивает общий доступ к коду между Windows Forms и другими платформами ГРАФИЧЕСКОго интерфейса .NET, такими как WPF, UWP/WinUI и .NET MAUI. Важно отметить, что в то время как ранее упоминание упоминание платформы графического интерфейса используют XAML в качестве технологии пользовательского интерфейса, XAML не поступает в Windows Forms.

Интерфейс IBindableComponent и BindableComponent класс управляют новой системой привязки. Control реализует интерфейс и предоставляет новые возможности привязки данных к Windows Forms.

Команды кнопки

Команды кнопки были в предварительной версии с .NET 7 и теперь полностью включены в .NET 8. Аналогично WPF, экземпляр объекта, реализующего ICommand интерфейс, можно назначить свойству кнопки Command . При нажатии кнопки вызывается команда.

Необязательный параметр можно указать при вызове команды, указав значение для свойства кнопки CommandParameter .

CommandParameter Свойства Command задаются в конструкторе в окне "Свойства" в разделе (DataBindings), как показано на следующем рисунке.

The Visual Studio properties window highlighting a Windows Forms' Button's Command and CommandParameter properties.

Кнопки также прослушивают ICommand.CanExecuteChanged событие, что приводит к запросу метода элементом ICommand.CanExecute управления. Когда этот метод возвращается true, элемент управления включен; элемент управления отключается при falseвозвращении.

Улучшения DPI Visual Studio

Visual Studio 2022 17.8 Содержит вкладки конструктора DPI-unwaware. Ранее вкладка конструктора Windows в Visual Studio выполнялась в DPI Visual Studio. Это приводит к проблемам при разработке приложения Windows Forms, не известного от DPI. Теперь вы можете убедиться, что конструктор выполняется в том же масштабе, что и приложение, которое будет запускаться, или нет. Прежде чем эта функция появилась, необходимо было запустить Visual Studio в режиме, не известном от DPI, что сделало Visual Studio себя размытым при применении масштабирования в Windows. Теперь вы можете оставить Visual Studio в одиночку и позволить конструктору запускать DPI-не зная.

Вы можете включить неузнаемый конструктор DPI для проекта Windows Forms, добавив <ForceDesignerDPIUnaware> в файл проекта и задав значение true.

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net8.0-windows</TargetFramework>
  <Nullable>enable</Nullable>
  <UseWindowsForms>true</UseWindowsForms>
  <ImplicitUsings>enable</ImplicitUsings>
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  <ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode>
</PropertyGroup>

Важно!

Visual Studio считывает этот параметр при загрузке проекта, а не при изменении. После изменения этого параметра выгрузите и перезагрузите проект, чтобы получить Visual Studio для его уважения.

Улучшения высокого уровня DPI

Улучшена отрисовка PerMonitorV2 высокого уровня DPI:

  • Правильно масштабировать вложенные элементы управления. Например, кнопка, которая находится на панели, которая размещается на вкладке.

  • Масштабирование Form.MaximumSize и Form.MinimumSize свойства на основе текущих параметров DPI монитора.

    Начиная с .NET 8 эта функция включена по умолчанию, и вам нужно отказаться от нее, чтобы отменить изменения предыдущего поведения.

    Чтобы отключить эту функцию, добавьте configPropertiesSystem.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi параметр в runtimeconfig.json и задайте значение false:

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

Прочие улучшения

Ниже приведены некоторые другие важные изменения:

  • Код, который обрабатывался FolderBrowserDialog , был улучшен, исправляя несколько утечек памяти.
  • База кода для Windows Forms медленно включает пустую возможность C# и удаляет любые потенциальные ошибки со ссылкой на null.
  • Исходный System.Drawing код был перенесен в репозиторий GitHub Windows Forms.
  • К современным значкам Windows можно получить доступ с помощью нового API. System.Drawing.SystemIcons.GetStockIcon Перечисление System.Drawing.StockIconId перечисляет все доступные системные значки.
  • В настоящее время выполнения доступны дополнительные конструкторы. Дополнительные сведения см. в статье GitHub о проблеме 4908.