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
在 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