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

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

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

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

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

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

  • Масштабирование Form.MaximumSize и Form.MinimumSize свойства на основе текущих параметров DPI монитора для приложений, на которые выполняется ApplicationHighDpiModePerMonitorV2задано значение.

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

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

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

Улучшения и исправления специальных возможностей

Этот выпуск добавляет дополнительные улучшения в специальные возможности, включая, но не ограничивается следующими элементами:

  • Устранены многие проблемы, связанные с объявлениями, которые наблюдались в средствах чтения с экрана, гарантируя правильность сведений об элементах управления. Например, теперь правильно объявляется, ListView когда группа развернута или свернута.

  • Теперь дополнительные элементы управления предоставляют поддержку модель автоматизации пользовательского интерфейса:

  • Утечки памяти, связанные с запуском приложения Windows Forms в вспомогательных средствах, таких как экранный диктор, были исправлены.

  • Вспомогательные инструменты теперь точно рисуют индикаторы фокуса и сообщают правильные ограничивающие прямоугольники для вложенных форм и некоторые элементы составных элементов управления, например DataGridView, ListViewи TabControl.

  • Шаблон элемента управления ExpandCollapse для пользовательского интерфейса службы автоматизации был правильно реализован в ListView, TreeViewа PropertyGrid также в элементах управления и активируется только для расширяемых элементов.

  • Различные исправления коэффициента контрастности цветов в элементах управления.

  • Улучшения видимости для ToolStripTextBoxToolStripButton и в темах высокой контрастности.

Улучшения привязки данных (предварительная версия)

Хотя в Windows Forms уже есть мощный механизм привязки, в настоящее время представлена более современная форма привязки данных, аналогичная привязке данных, предоставляемой WPF.

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

Эти новые функции привязки данных находятся в предварительной версии для .NET 7, и эта функция будет работать в .NET 8.

Чтобы включить новую привязку, добавьте параметр в EnablePreviewFeatures файл проекта. Это поддерживается как в C#, так и в Visual Basic.

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

  <!-- other settings -->

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

</Project>

В следующем фрагменте кода показаны новые свойства, события и методы, добавленные в различные классы в Windows Forms. Несмотря на то, что следующий пример кода находится в C#, он также применяется к 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);
}

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

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

  • Обработка перетаскивания соответствует функциональным возможностям перетаскивания Windows с более богатыми эффектами отображения, такими как значки и текстовые метки.
  • Диалоговые окна папок и файлов позволяют использовать дополнительные параметры:
    • Добавление в последние
    • Проверка доступа на запись
    • Развернутый режим
    • ОК требует взаимодействия
    • Выбор только для чтения
    • Отображение скрытых файлов
    • Отображение закрепленных мест
    • Показать предварительную версию
  • ErrorProviderHasErrors теперь имеет свойство.
  • Макет оснастки формы исправлен для Windows 11.

См. также