Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Основное внимание в пользовательском интерфейсе приложений .NET Multi-platform (.NET MAUI) в .NET 10 уделяется улучшению качества продукта. Чтобы узнать, что нового в каждом выпуске .NET MAUI в .NET 10, см. следующие заметки о выпуске:
- .NET MAUI в .NET 10 (предварительная версия 6)
- .NET MAUI в .NET 10 предварительная версия 5
- .NET MAUI в .NET 10 предварительная версия 4
- .NET MAUI в .NET 10 (предварительная версия 3)
- .NET MAUI в .NET 10 предварительная версия 2
- .NET MAUI в .NET 10 предварительная версия 1
Важный
Из-за работы с внешними зависимостями, такими как средства Xcode или Android SDK, политика поддержки .NET MAUI отличается от политики поддержки .NET и .NET Core. Дополнительные сведения см. в документе о политике поддержки .NET MAUI.
В .NET 10, .NET MAUI поставляется в виде рабочей загрузки .NET и в составе нескольких пакетов NuGet. Преимущество этого подхода заключается в том, что он позволяет легко закреплять проекты в определенных версиях, а также позволяет легко просматривать нераспроданные или экспериментальные сборки.
Улучшения MediaPicker (предварительная версия 6)
MediaPicker
был расширен с поддержкой выбора нескольких файлов и сжатия изображений непосредственно из API, используя параметры MaximumWidth
и MaximumHeight
.
var result = await MediaPicker.PickMultipleAsync(new MediaPickerOptions
{
MaximumWidth = 1024,
MaximumHeight = 768
});
XAML с неявными и глобальными пространствами имен XML (предварительная версия 5)
.NET 10 Preview 5 представляет более чистый опыт работы с пространством имен XML для .NET MAUI, который очищает почти все шаблонные xmlns:
строки, которые обычно копировались в верхней части каждого XAML-файла.
Что изменилось | Принцип работы |
---|---|
Глобальные пространства имен на уровне проекта |
http://schemas.microsoft.com/dotnet/maui/global — это новый xmlns, который можно использовать для объединения нескольких xmlns. По умолчанию он включает xmlns maui (sourcegenerated), {YourNamespace}, и {YourNamespace}. Pages |
Обратная совместимость | Существующие явные xmlns: сопоставления по-прежнему компилируются; добавьте их только в том случае, если необходимо отсознать имена повторяющихся типов. |
Неявное пространство имен по умолчанию (согласие) | При включении этой опции компилятор теперь автоматически вставляет http://schemas.microsoft.com/dotnet/2021/maui , что позволяет удалять строки xmlns и xmlns:x . |
До и после
<!-- .NET 8 style -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:MyApp.Models"
xmlns:controls="clr-namespace:MyApp.Controls"
x:Class="MyApp.MainPage">
<controls:TagView x:DataType="models:Tag" />
</ContentPage>
<!-- .NET 10 Preview 5 -->
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/maui/global"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.MainPage">
<TagView x:DataType="Tag" />
</ContentPage>
Изменения:
- Нет необходимости объявлять
xmlns:models
илиxmlns:controls
потому, что они объявлены глобально вGlobalXmlns.cs
файле - Нет префиксов, необходимых для
TagView
илиTag
<!-- .NET 10 Preview 5 plus opt-in -->
<ContentPage x:Class="MyApp.MainPage">
<TagView x:DataType="Tag" />
</ContentPage>
Изменения:
- Нет необходимости объявлять
xmlns
илиxmlns:x
так как они неявно добавляются в глобальное пространство имен
Как принять
Создайте новый проект, чтобы просмотреть оптимизированный интерфейс или обновить существующий проект, используя приведенные ниже сведения.
-
Обновите проект до
net10.0-
целевых фреймворков. -
Добавьте один файл уровня сборки (например
GlobalXmlns.cs
, который сопоставляет пространства имен CLR). -
Удалите избыточные
xmlns:
строки и префиксы из XAML. IntelliSense и Hot Reload продолжают работать, просто с гораздо более чистой разметкой.
<PropertyGroup>
<DefineConstants>$(DefineConstants);MauiAllowImplicitXmlnsDeclaration</DefineConstants>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
Пример GlobalXmlns.cs
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Views")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Controls")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Converters")]
Если вы предпочитаете продолжать использовать префиксы xmlns в XAML, вы можете также предоставить для них префиксы по умолчанию в GlobalXmlns.cs
.
using XmlnsPrefixAttribute = Microsoft.Maui.Controls.XmlnsPrefixAttribute;
[assembly: XmlnsPrefix("MyApp.Controls","controls")]
Используйте их, как и раньше.
<ContentPage x:Class="MyApp.MainPage">
<controls:TagView x:DataType="Tag" />
</ContentPage>
✨ Совет. Здесь также можно зарегистрировать сторонние библиотеки!
Перехват веб-запросов (предварительная версия 5 и 6)
Теперь вы можете перехватывать и реагировать на веб-запросы, сделанные из BlazorWebView
и HybridWebView
. Это позволяет выполнять такие сценарии, как изменение заголовков, перенаправление запросов или предоставление локальных ответов.
webView.WebResourceRequested += (s, e) =>
{
if (e.Uri.ToString().Contains("api/secure"))
{
e.Handled = true;
e.SetResponse(200, "OK", "application/json", GetCustomStream());
}
};
Другой пример из XAML:
<HybridWebView WebResourceRequested="HybridWebView_WebResourceRequested" />
private void HybridWebView_WebResourceRequested(object sender, HybridWebViewWebResourceRequestedEventArgs e)
{
// NOTES:
// * This method MUST be synchronous, as it is called from the WebView's thread.
// * This method MUST return a response (even if it is not yet complete), otherwise the
// WebView may freeze or return a error response.
// * The response must be set using the SetResponse method of the event args.
// Only handle requests for the specific image URL
if (!e.Uri.ToString().Contains("sample-image.png"))
return;
// Prevent the default behavior of the web view
e.Handled = true;
// Return the stream or task of stream that contains the content
// NOTE: the method is NOT awaited, the WebView will continue to load the content
e.SetResponse(200, "OK", "image/png", GetStreamAsync());
}
Интеграция .NET Aspire
.NET MAUI для .NET 10 содержит новый шаблон проекта, который создает проект службы .NET Aspire по умолчанию для .NET MAUI. Это предоставляет набор методов расширения, которые подключают телеметрию и службы обнаружения к приложению.
Чтобы подключить телеметрию и обнаружение служб к вашему приложению, измените метод CreateMauiApp
в классе MauiProgram
, чтобы вызвать метод AddServiceDefaults
на объекте MauiAppBuilder
из проекта настроек по умолчанию службы .NET Aspire.
builder.AddServiceDefaults();
Метод AddServiceDefaults
выполняет следующие задачи:
- Настраивает метрики OpenTelemetry и трассировку.
- Добавляет функциональность обнаружения служб.
- Настраивает HttpClient для работы с обнаружением служб.
Важный
Проект службы .NET Aspire по умолчанию предназначен для совместного использования файла Extensions.cs и его функциональных возможностей. Не включайте в этот проект другие общие функции или модели. Вместо этого используйте проект библиотеки общих классов для этих целей.
Для получения дополнительной информации см. стандартные параметры службы .NET Aspire.
Мультипликация
Методы FadeTo
, LayoutTo
, RelRotateTo
, RelScaleTo
, RotateTo
, RotateXTo
, RotateYTo
, ScaleTo
, ScaleXTo
, ScaleYTo
и TranslateTo
были признаны устаревшими и заменены на методы FadeToAsync
, LayoutToAsync
, RelRotateToAsync
, RelScaleToAsync
, RotateToAsync
, RotateXToAsync
, RotateYToAsync
, ScaleToAsync
, ScaleXToAsync
, ScaleYToAsync
и TranslateToAsync
.
Дополнительные сведения см. в разделе "Базовая анимация".
Элементы управления
.NET MAUI в .NET 10 включает усовершенствования элементов управления и устаревания.
CollectionView и CarouselView
.NET MAUI в .NET 9 включал два необязательных обработчика в iOS и Mac Catalyst, что привело к улучшению производительности и стабильности для CollectionView и CarouselView. В .NET 10 это обработчики по умолчанию для CollectionView и CarouselView.
Редактор и ввод в Android
В Android Editor и Entry представления изменяют свои собственные представления с AppCompatEditText
MauiAppCompatEditText
, что добавляет поддержку SelectionChanged
события.
HybridWebView
HybridWebView получает перегрузку InvokeJavaScriptAsync, которая вызывает указанный метод JavaScript без указания сведений о типе возвращаемого значения. Дополнительные сведения см. в статье Вызов методов JavaScript, которые не возвращают значение.
По умолчанию все исключения, вызываемые кодом JavaScript, будут отправляться в .NET, где они повторно выбрасываются как исключения .NET.
Отображение списка
ListView не рекомендуется использовать, EntryCellа также , ImageCell, SwitchCell, TextCellи ViewCell. Вместо этого следует использовать CollectionView.
Замечание
Cell не устарел, потому что в настоящее время используется для генерации исходного кода. Однако его следует считать устаревшим.
Панель поиска
SearchBar получает привязываемое свойство SearchIconColor
, которое задает цвет значка поиска:
<SearchBar Placeholder="Search items..."
SearchIconColor="Blue" />
SearchBar также получает привязываемое ReturnType
свойство типа, ReturnTypeуказывающее внешний вид кнопки возврата. Значение по умолчанию этого свойства равно Search
.
Более подробную информацию см. в разделе SearchBar.
Выключатель
Switch получает привязываемое свойство OffColor
, которое задает цвет коммутатора при его отключенном состоянии:
<Switch OffColor="Red"
OnColor="Green" />
Дополнительные сведения см. в разделе Switch.
Представление таблицы
TableView устарел. Вместо этого следует использовать CollectionView.
WebView в Android
Когда видео размещено в WebView на Android, теперь их можно воспроизводить в полноэкранном режиме, включив allowfullscreen
в iframe
.
Дополнительные сведения см. в разделе "Воспроизведение видео в полноэкранном режиме".
Центр сообщений
MessagingCenter был создан внутри .NET 10. Использование в вашем коде можно заменить на WeakReferenceMessenger
в пакете NuGet CommunityToolkit.Mvvm . Дополнительные сведения см. в разделе Messenger.
Тени
В .NET 10 класс ShadowTypeConverter
в пространстве имен Microsoft.Maui.Controls
теперь является общедоступным.
Дополнительные сведения о том, как тени можно указать с помощью отформатированных строк, см. в разделе "Тень".
Функции платформы
Функции платформы .NET MAUI получили некоторые обновления в .NET 10.
Отображение модальной страницы в качестве всплывающего элемента в iOS и Mac Catalyst
.NET MAUI для .NET 10 добавляет платформо-специфическую функцию, которая отображает модальную страницу как всплывающее окно на iOS и Mac Catalyst. Он используется путем задания привязываемого свойства Page.ModalPopoverSourceView
в View
, который определяет источник модального окна, привязываемого свойства Page.ModalPopoverRect
к Rectangle, который определяет прямоугольник в представлении, из которого будет исходить всплывающее окно, и привязываемого свойства Page.ModalPresentationStyle
к Popover
.
using Microsoft.Maui.Controls.PlatformConfiguration;
using Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;
public partial class PopoverPage : ContentPage
{
public PopoverPage(View modal, Rectangle rectangle)
{
InitializeComponent();
On<iOS>().SetModalPopoverView(modal);
On<iOS>().SetModalPopoverRect(rectangle);
On<iOS>().SetModalPresentationStyle(UIModalPresentationStyle.Popover);
}
}
Затем перейдите на модальную страницу с помощью метода Navigation.PushModalAsync
:
Page modalPage = new PopoverPage(originButton, Rectangle.Empty);
await Navigation.PushModalAsync(modalPage);
Дополнительные сведения см. в разделе Отображение модальной страницы в виде всплывающего окна в iOS и Mac Catalyst.
Геолокация
Класс Geolocation получает свойство только для IsEnabled
чтения, которое можно использовать для определения того, включены ли службы расположения на устройстве.
Совместимость с iOS и Mac Catalyst, доступность и расширения
Следующие методы расширения совместимости iOS AccessibilityExtensions
, в Microsoft.Maui.Controls.Compatibility.Platform.iOS
, были признаны устаревшими:
SetAccessibilityHint
SetAccessibilityLabel
SetAccessibilityHint
SetAccessibilityLabel
Вместо этого следует использовать метод Microsoft.Maui.Platform.UpdateSemantics
.
Переопределения для iOS и Mac Catalyst в MauiWebViewNavigationDelegate
Теперь можно переопределять следующие методы MauiWebViewNavigationDelegate
в пространстве имен Microsoft.Maui.Platform
:
DecidePolicy
DidFailNavigation
DidFailProvisionalNavigation
DidFinishNavigation
Преобразование текста в речь
Класс SpeechOptions получает свойство Rate
, которое управляет скоростью речи при использовании функций TextToSpeech. Дополнительные сведения см. в параметрах преобразования текста в речь.
Веб-проверка подлинности
WebAuthenticator получает перегрузку метода AuthenticateAsync, которая позволяет с помощью аргумента CancellationToken программно отменить поток проверки подлинности.
Всплывающие окна
Устаревшие методы DisplayAlert
и DisplayActionSheet
были заменены на методы DisplayAlertAsync
и DisplayActionSheetAsync
.
Дополнительные сведения см. в разделе "Отображение всплывающих окон".
Расширения разметки XAML
Расширение разметки XAML FontImageExtension устарело. Вместо этого следует использовать тип FontImageSource:
<Button Text="Press me"
Background="Transparent"
TextColor="{AppThemeBinding Light=Black, Dark=White}"
ImageSource="{FontImageSource Glyph=MyGlyph, Color={AppThemeBinding Light=Black, Dark=White}, FontFamily=FontAwesome, Size=18}" />
Для удобства синтаксис элемента свойства также можно использовать:
<Button Text="Press me"
Background="Transparent"
TextColor="{AppThemeBinding Light=Black, Dark=White}" >
<Button.ImageSource>
<FontImageSource Glyph="MyGlyph"
Color="{AppThemeBinding Light=Black, Dark=White}"
FontFamily="FontAwesome"
Size="18" />
</Button.ImageSource>
</Button>
Дополнительные сведения см. в разделе Отображение значков шрифтов.
.NET для Android
.NET для Android в .NET 10 добавляет поддержку API 36 и JDK 21 и включает в себя работу, чтобы сократить время сборки и повысить производительность. Дополнительные сведения о .NET для Android в .NET 10 см. в следующих заметках о выпуске:
- .NET для Android 10 (предварительная версия 3)
- .NET для Android 10 предварительная версия 2
- .NET для Android 10 Пробная версия 1
Бета-версия 3 привязок Android 16 (Baklava)
Google выпустила бета-версию 3 пакета SDK для Android 16 (API 36). Хотя все еще классифицируется как предварительная версия, интерфейсы прикладного программирования (ABIs) были объявлены стабильными, и окончательный выпуск Android 16 от Google ожидается этим летом.
API 36 теперь используется по умолчанию в .NET 10, что означает, что API 36 будет использоваться при $(TargetFramework)
установке net10.0-android
свойства сборки.
Это приведет к проблемам при использовании Visual Studio и Visual Studio Code с .NET 10, так как они еще не знают об API 36, что приведет к возникновению ошибки XA5207 . Чтобы устранить эту проблему, необходимо вручную установить API36 platform.jar в каталог пакета SDK для Android или дождаться предстоящего обновления до Visual Studio.
Рекомендуемый минимальный поддерживаемый API Android
Шаблоны проектов .NET для Android были обновлены, чтобы указать 24 (Nougat) в качестве $(SupportedOSPlatformVersion)
по умолчанию вместо 21 (Lollipop). Это предотвращает сбой среды выполнения desugaring при использовании методов интерфейса Java по умолчанию.
Хотя API 21 по-прежнему поддерживается в .NET 10, рекомендуется обновить существующие проекты до API 24, чтобы избежать непредвиденных ошибок среды выполнения.
dotnet run
поддержка
Ранее команда dotnet run
не поддерживается для проектов .NET для Android, так как она не принимает параметры, необходимые для указания используемого устройства или эмулятора Android.
В .NET 10 проекты .NET для Android можно запускать с помощью команды dotnet run
:
// Run on the only attached Android physical device
dotnet run -p:AdbTarget=-d
// Run on the only running Android emulator
dotnet run -p:AdbTarget=-e
// Run on the specified Android physical device or emulator
dotnet run -p:AdbTarget="-s emulator-5554"
Свойство $(AdbTarget)
передается в adb
. Для получения дополнительной информации смотрите раздел Выполнение команд оболочки на сайте developer.android.com.
Методы маршалинга включены по умолчанию
В .NET 9 новый способ создания маршаловых методов, необходимых для вызова Java в код C#, обеспечил улучшения производительности запуска. Однако в .NET 9 они были отключены по умолчанию.
В .NET 10 они включены по умолчанию. Проблемы с этими методами маршалинга часто проявляются в виде зависания при запуске. Если вы сталкиваетесь с зависанием программы при запуске в предварительных версиях .NET 10, которого не было в .NET 9, попробуйте отключить методы маршалинга, установив для свойства MSBuild $(AndroidEnableMarshalMethods)
значение false
в файле проекта:
<PropertyGroup>
<AndroidEnableMarshalMethods>false</AndroidEnableMarshalMethods>
<PropertyGroup>
Если это исправляет зависание, отправьте запрос о проблеме.
метаданные ArtifactFilename
для элемента @(AndroidMavenLibrary)
@(AndroidMavenLibrary)
был добавлен в .NET 9 и позволяет автоматически загружать и связывать Java библиотеку из Maven. Как правило, эта библиотека называется {artifact.Id}-{artifact.Version}.[jar|aar]
. Однако это не соответствует стандарту и может быть произвольно отличаться.
В .NET 10 можно добавить метаданные ArtifactFilename
в элемент MSBuild @(AndroidMavenLibrary)
, чтобы разрешить альтернативное имя файла:
<ItemGroup>
<AndroidMavenLibrary Include="com.facebook.react:react-android" Version="0.76.0" ArtifactFilename="react-android-0.76.0-release.aar" />
</ItemGroup>
System.IO.Compression, используемый для создания .apk
Исторически dotnet/android-libzipsharp использовался для обработки ZIP-архивов и создания файлов AAB и .apk .
В .NET 10:
- Для вызовов
dotnet build
командной строки ZipArchive используется для создания файлов AAB и .apk. Это приведет к более быстрому времени сборки. - Для сборок Visual Studio dotnet/android-libzipsharp все еще используется, так как версия System.IO.Compression .NET Framework не может быть использована.
Компиляции времени проектирования в Visual Studio больше не вызывают aapt2
Чтобы ускорить процесс сборки в рамках времени разработки, aapt2
больше не вызывается. Вместо этого .aar
файлы и базовые ресурсы Android анализируются напрямую. Это сокращает время сборки на этапе проектирования для некоторых модульных тестов с более чем 2 секунд до менее чем 600 мс.
Строительство с помощью JDK 21
Теперь проекты .NET для Android можно создавать с помощью JDK 21.
generator
результат избегает потенциального использования System.Reflection.Emit
Запуск приложения и общая производительность были оптимизированы за счет удаления путей кода, которые могут приводить к возникновению System.Reflection.Emit
в процессе вызова из Java в C#.
ApplicationAttribute.ManageSpaceActivity
больше не вызывает InvalidCastException
Установка свойства ApplicationAttribute.ManageSpaceActivity
не приводит к ошибке XAGJS7007 в .NET 10.
.NET для iOS
.NET 10 в iOS, tvOS, Mac Catalyst и macOS поддерживают следующие версии платформы:
- iOS: 18.2
- tvOS: 18.2
- Mac Catalyst: 18.2
- macOS: 15.2
Дополнительные сведения о .NET 10 в iOS, tvOS, Mac Catalyst и macOS см. в следующих заметках о выпуске:
Сведения об известных проблемах см. в разделе Известные проблемы в .NET 10.
Триммер включен в дополнительных конфигурациях
Триммер теперь включен в следующих конфигурациях:
- Симулятор iOS/arm64 (все конфигурации)
- TvOS Simulator/arm64 (все конфигурации)
- Mac Catalyst/arm64 (все конфигурации)
Предупреждения триммера, включенные по умолчанию
Предупреждения триммера ранее подавлялись, потому что библиотека базовых классов вызывала появление таких предупреждений, что означало невозможность самостоятельно устранить их все. Однако в .NET 9 все предупреждения обрезки iOS были исправлены, поэтому предупреждения обрезки теперь включены по умолчанию. Чтобы отключить предупреждения триммера, задайте для свойства MSBuild $(SuppressTrimAnalysisWarnings)
значение true
в файле проекта:
<PropertyGroup>
<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
</PropertyGroup>
Объединение исходных ресурсов в библиотеках
Проекты библиотеки могут иметь различные типы ресурсов пакета, такие как раскадровки, xibs, списки свойств, изображения, модели CoreML и атласы текстур, и они упаковываются в скомпилированную библиотеку как внедренные ресурсы.
Обработка этих ресурсов, таких как компиляция раскадровок или XIB-файлов, или оптимизация списков свойств и изображений, выполняется перед внедрением, что усложняет процесс сборки библиотеки, поскольку обработка:
- Необходимо запустить на Mac, так как компиляция storyboards/xibs может выполняться только на Mac.
- Требуется набор инструментов Apple.
- Делает невозможным принятие решений на основе исходных ресурсов при создании приложения.
Поэтому поддержка, включенная по умолчанию для внедрения исходного ресурса в библиотеки, была добавлена в .NET 9, а в .NET 10 она теперь по умолчанию отключена. Чтобы отказаться от этого поведения, задайте для свойства MSBuild $(BundleOriginalResources)
значение false
в файле проекта:
<PropertyGroup>
<BundleOriginalResources>false</BundleOriginalResources>
</PropertyGroup>
Создание проектов привязки в Windows
Теперь проекты привязки полностью собираются на Windows, поэтому в удаленном подключении к Mac больше нет необходимости. Это значительно ускоряет создание проектов привязки в Windows.
NSUrlSessionHandler больше не задает минимальную поддерживаемую версию протокола TLS для сеанса.
NSUrlSessionHandler Ранее инициализировал NSUrlSessionConfiguration.TLSMinimumSupportedProtocol значение из свойства ServicePointManager.SecurityProtocol, но теперь устарел ServicePointManager класс. Поэтому перед созданием NSUrlSessionConfiguration.TLSMinimumSupportedProtocolпараметра необходимо задать NSUrlSessionHandler значение:
var sessionConfiguration = NSUrlSessionConfiguration.DefaultSessionConfiguration;
sessionConfiguration.TlsMinimumSupportedProtocolVersion = TlsProtocolVersion.Tls13;
var handler = new NSUrlSessionHandler(sessionConfiguration);
Свойство NSUrlSessionHandler.BypassBackgroundSessionCheck игнорируется
Свойство NSUrlSessionHandler.BypassBackgroundSessionCheck
существует из-за старой проблемы в среде выполнения Mono. Этот обходной путь больше не требуется, поэтому это свойство игнорируется.