首页 > 解决方案 > Blazor 中是否有我可以修改的 App 对象?

问题描述

在 WPF 中,有一个创建的默认对象,称为AppApplicationBase. 开发人员可以根据需要添加属性等。

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

期望的目标是添加一个字符串属性,所以我可以做这样的事情:

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);
    }
    

标签: blazorblazor-webassembly

解决方案


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

定义一个类

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; }
    }
}

将其作为单例添加到启动/程序中的服务

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

在任何组件/页面中显示/使用/设置它

<h3>@MyBase.Message</h3>

@code {

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

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

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

如果您想在一个地方更改它并让它在其他地方更新,您需要实现通知服务 -请参阅 MsDocs 中的此处


推荐阅读