这有点小题大做,但通过一些 JS 互操作来管理它。我是 Blazor 的新手,但我设法从其他各种帖子中找到了这一点;
向您的弹出窗口添加一个 id - 称为我的个人资料弹出窗口
<div id="profile-popup">
<RadzenProfileMenu @ref="profileMenu" Style="width: 200px;" >
<Template>
<div class="row">...
创建一个 JS 文件以将处理程序附加到文档的单击事件 - 如果单击源在您的弹出窗口中,请忽略它,否则从您的帮助程序类中触发一个帮助程序方法
window.attachHandlers = (dotnetHelper) => {
document.addEventListener("click", (evt) => {
const profileElement = document.getElementById("profile-popup");
let targetElement = evt.target;
do {
if (targetElement == profileElement) {
//return as not clicked outside
return;
}
targetElement = targetElement.parentNode;
} while (targetElement);
dotnetHelper.invokeMethod("InvokeAction");
});
};
创建助手类
public class ProfileOutsideClickInvokeHelper
{
Action _action;
public ProfileOutsideClickInvokeHelper(Action action)
{
_action = action;
}
[JSInvokable]
public void InvokeAction()
{
_action.Invoke();
}
}
在 OnAfterRender 覆盖中附加处理程序。我有一个包含弹出窗口的组件。您需要处理对象引用
public partial class TopBanner : IDisposable
{
[Inject]
IJSRuntime JSRuntime { get; set; }
public void CloseProfileMenu()
{
profileMenu.Close();
}
DotNetObjectReference<ProfileOutsideClickInvokeHelper> _objRef;
protected override void OnAfterRender(bool firstRender)
{
_objRef = DotNetObjectReference.Create(new ProfileOutsideClickInvokeHelper(CloseProfileMenu));
JSRuntime.InvokeVoidAsync("attachHandlers", _objRef);
}
public void Dispose()
{
_objRef?.Dispose();
}
}
不确定这是否是最好的解决方案,甚至是一个好的解决方案,但它似乎工作正常。