blazor - Blazor 中是否有我可以修改的 App 对象?
问题描述
在 WPF 中,有一个创建的默认对象,称为App
从ApplicationBase
. 开发人员可以根据需要添加属性等。
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);
}
解决方案
我不确定,但也许您需要的是单例服务。
定义一个类
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 中的此处
推荐阅读
- kotlin - CollectionsKt.removeAll 是做什么的?
- javascript - 如何指定 Web MIDI 通道?
- vim - 在映射中使用“z=”
- jasmine - 说 Jasmine spy 没有被调用,但我可以看到它被调用
- security - OAuth 2.0 - 为什么同意屏幕不需要客户端密码?
- python - 按列排序和选择,同时在 python 中保留原始索引
- reactjs - history.push(path) 在 react-router-dom v4 中不起作用,在重定向到 404 时使用 redux
- python - 如何使用 python3 修改传入的 HTTPS 和 HTTP 请求
- ios - 如何在 collectionView 单元格中设置 NSLayoutConstraint 常量?
- deep-learning - 如何在不混合批次中项目元素的情况下重塑pytorch矩阵