Blazor 中是否有我可以修改的 App 对象?

Is there an App object in Blazor that I can modify?

在 WPF 中,创建了一个名为 App 的默认对象,它派生自 ApplicationBase。开发者可以根据需要添加属性等。

Blazor 中是否有类似的概念,如果有,我如何将 属性 添加到 App 对象?

想要 objective 是添加一个字符串 属性 这样我就可以这样做:

App.StatusBarMessage = "Hello";

感谢下面的答案,这是最终的解决方案。 MessageService 是惊人的两行,这就是为什么我只想将它添加到 App。

消息类型和消息服务:

public enum MessageType
{ 
    None,
    Info,
    Warning,
    Error,
    Loading,
    LoadingComplete
}

public class MessageService
{
    public async Task ShowMessage(string message, MessageType messageType) => await Notify?.Invoke(message, messageType);

    public event Func<string, MessageType, Task> Notify;
}

Program.cs中的服务注册:

builder.Services.AddSingleton<MessageService>();

MessageBox.razor 侦听 MessageService 上的事件并显示它们:

@if (MessageType == MessageType.Loading)
{
    <img src="please_wait.gif" style="height:50px;width:50px" /> <h3>Loading....</h3>
}
else if (MessageType == MessageType.Info)
{
    <i class="bi bi-info-circle"></i> @Message
}
else if (MessageType == MessageType.Warning)
{
    <i class="bi bi-exclamation-circle"></i>@Message
}
else if (MessageType == MessageType.Error)
{
    <i class="bi bi-x-circle"></i>@Message
}



@inject MessageService MessageService
@code {
    private MessageType MessageType;
    private string Message;
    private int LoadingCount;


    protected override void OnInitialized()
    {
        base.OnInitialized();
        MessageService.Notify += OnMessageReceived;
    }


    private async Task OnMessageReceived(string message, MessageType messageType)
    {
        await InvokeAsync(() =>
        {
            if (messageType == MessageType.Loading)
                LoadingCount++;
            else if (messageType == MessageType.LoadingComplete)
            {
                LoadingCount = Math.Max(0, --LoadingCount);
                messageType = LoadingCount == 0 ? MessageType.None : MessageType.Loading;
            }

            Message = message;
            MessageType = messageType;
            StateHasChanged();
        });
    }



    public void Dispose() => MessageService.Notify -= OnMessageReceived;
}

在其他一些控件中,注入 MessageService 并调用 ShowMessage:

@code{
    [Inject] private MessageService MessageService { get; set; }
    
    //...

    public async Task ErrorHandler(string msg)
    {
        await MessageService.ShowMessage(msg, MessageType.Error);
    }
    

我不确定,但也许您需要的是单例服务。

定义一个class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Blazor.Starter.Services
{
    public class BaseService
    {
        public string Message { get; set; }
    }
}

将其作为单例添加到 startup/Program 中的服务中

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddSingleton<BaseService>();
        }

Display/Consume/set 它在任何 component/page

<h3>@MyBase.Message</h3>

@code {

    [Inject] private BaseService MyBase { get; set; }

    void ConsumerMethod()
    {
        var x = MyBase.Message;
    }

    void SetterMethod()
    {
        MyBase.Message = "Bonjour";
    }
}

如果您想在一个地方更改它并在其他地方更新它,您需要实施通知服务 - see here in MsDocs