Я попытался динамически изменить цвет строки заголовка в соответствии с выбранной пользователем темой в моем приложении MAUI для Windows. Это многоплатформенный шаблон MAUI, похожий на Xamarin Forms. Наконец, я добавил ViewModel в App.xaml.cs внутри проекта Windows и попытался динамически изменить цвет с помощью MessagingCenter. это сработало, но устарело. Поэтому я переключился на WeakReferenceMessenger, но он выдает исключение.
Внутреннее исключение
{"Не удалось загрузить файл или сборку WinRT.Runtime, версия = 2.1.0.0, Культура = нейтрально, PublicKeyToken = 99ea127f02d97709'. Система не может найдите указанный файл.":"WinRT.Runtime, Version=2.1.0.0, Culture=нейтрально, PublicKeyToken=99ea127f02d97709"} System.Exception {System.IO.FileNotFoundException}
Сообщение
«Инициализатор типа для
'<Module>'
вызвал исключение». нить
App.xaml.cs (внутри проекта Windows)
using Microsoft.UI.Xaml;
namespace XX.WinUI;
public partial class App : MauiWinUIApplication
{
public App()
{
this.InitializeComponent();
}
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
base.OnLaunched(args);
this.Resources["AppViewModel"] = new AppViewModel();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
ViewModel (внутри проекта Windows)
public partial class AppViewModel : INotifyPropertyChanged
{
private string _titleBarColor;
private string _titleColor;
public string TitleBarColor
{
get => _titleBarColor;
set
{
if (_titleBarColor != value)
{
_titleBarColor = value;
OnPropertyChanged();
}
}
}
public string TitleColor
{
get => _titleColor;
set
{
if (_titleColor != value)
{
_titleColor = value;
OnPropertyChanged();
}
}
}
public AppViewModel()
{
WeakReferenceMessenger.Default.Register<WeakReferenceMessage>(this, (r, m) =>
{
});
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class WeakReferenceMessage : ValueChangedMessage<TitleBarModel>
{
public WeakReferenceMessage(TitleBarModel value) : base(value)
{
}
}
(Внутри проекта Windows) Этот метод находится внутри UWPPhoneFeatureService, который является собственным настраиваемым средством визуализации.
public void ChangeDeviceStatusBarColor()
{
TitleBarModel titleBarModel = new TitleBarModel();
string themeCode = GetAppSetting("ColorTheme");
Windows.UI.Color col;
switch (themeCode)
{
case "theme-black":
col = ConvertColor(38, 33, 61);
titleBarModel.TitleColor = "#FFFFFF";
break;
case "theme-monaco":
col = ConvertColor(124, 147, 131);
titleBarModel.TitleColor = "#FFFFFF";
break;
default:
col = ConvertColor(1, 179, 239);
titleBarModel.TitleColor = "#FFFFFF";
break;
}
titleBarModel.TitleBarColor = AppSettingKey.statusBarColor = $"#{col.R:X2}{col.G:X2}{col.B:X2}";
WeakReferenceMessenger.Default.Send(new WeakReferenceMessage(titleBarModel));
}
сторона окна
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder.UseSharedMauiApp();
builder.UseMauiCommunityToolkit();
builder.UseMauiCameraView();
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler(typeof(FormsWebView), typeof(FormsWebViewRenderer));
});
builder.Services.AddSingleton<IPhoneFeatureService, UWPPhoneFeatureService>();
return builder.Build();
}
}
Версия .NET 8.
У меня была такая же проблема. Похоже, что CommunityToolkit.Mvvm версии 8.3.0 вызывает проблему. Попробуйте понизить версию CommunityToolkit.Mvvm до 8.2.2. Версия 8.3.0 вышла в тот же день, когда вы написали.
Это помогло мне. У меня была такая же ошибка, после понижения все заработало.
Спасибо @philip, я боролся с этим последние два дня.
Попробуйте добавить
<WindowsAppSdkDeploymentManagerInitialize>false</WindowsAppSdkDeploymentManagerInitialize>
в csproj. А какая версия .NET, 7 или 8?