我试图对 Blazor 中的 onscroll 事件做出反应,以便在用户向下滚动网页时为图像设置动画(类似于此网站上的品牌徽标:https://lebenswelten-stgabriel.at/ https://lebenswelten-stgabriel.at/)。我尝试过本机 onscroll 事件,也尝试使用 js 互操作,但它没有执行任何操作。这是目前 Blazor 中不可用的东西,还是我可能只是在错误的组件上监听滚动事件?
经过几次试验和错误后,我决定创建一个自定义 .net 服务,并在 js 端注册。该服务看起来像这样:
using System;
using Microsoft.JSInterop;
namespace myBlazorApp.Services
{
public class ScrollInfoService: IScrollInfoService
{
public event EventHandler<int> OnScroll;
public ScrollInfoService(IJSRuntime jsRuntime)
{
RegisterServiceViaJsRuntime(jsRuntime);
}
private void RegisterServiceViaJsRuntime(IJSRuntime jsRuntime)
{
jsRuntime.InvokeVoidAsync("RegisterScrollInfoService", DotNetObjectReference.Create(this));
}
public int YValue { get; private set; }
[JSInvokable("OnScroll")]
public void JsOnScroll(int yValue)
{
YValue = yValue;
Console.WriteLine("ScrollInfoService.OnScroll " + yValue);
OnScroll?.Invoke(this, yValue);
}
}
public interface IScrollInfoService
{
event EventHandler<int> OnScroll;
int YValue { get; }
}
}
该服务从 DOM 接收 onscroll 事件并在 .net 端引发一个事件。这是 js 端脚本的样子:
window.onscroll = function() {
if (window.scrollInfoService != null)
window.scrollInfoService.invokeMethodAsync('OnScroll', window.pageYOffset);
}
window.RegisterScrollInfoService = (scrollInfoService) => {
window.scrollInfoService = scrollInfoService;
}
然后,我将我的服务注入到任何需要它的 Blazor 组件中,如下所示:
@using myBlazorApp.Services
@inject IScrollInfoService scrollInfoService
@implements IDisposable
<div>
...
</div>
@code {
protected override void OnInitialized()
{
scrollInfoService.OnScroll += OnScroll;
}
private void OnScroll(object sender, int yValue)
{
DoSomething(yValue);
}
public void Dispose()
{
scrollInfoService.OnScroll -= OnScroll;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)