Новые возможности Windows Forms для .NET 7
В этой статье описываются некоторые новые функции и усовершенствования Windows Forms в .NET 7.
При миграции с платформа .NET Framework на .NET 7 следует учитывать несколько критических изменений. Дополнительные сведения см. в разделе Критические изменения в Windows Forms.
Улучшения высокого уровня DPI
Улучшена отрисовка PerMonitorV2 высокого уровня DPI:
Правильно масштабировать вложенные элементы управления. Например, кнопка, которая находится на панели, которая размещается на вкладке.
Масштабирование Form.MaximumSize и Form.MinimumSize свойства на основе текущих параметров DPI монитора для приложений, на которые выполняется
ApplicationHighDpiMode
PerMonitorV2
задано значение.В .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 также в элементах управления и активируется только для расширяемых элементов.
Различные исправления коэффициента контрастности цветов в элементах управления.
Улучшения видимости для ToolStripTextBox ToolStripButton и в темах высокой контрастности.
Улучшения привязки данных (предварительная версия)
Хотя в 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.
См. также
.NET Desktop feedback