新闻中心

Blazor 怎么监听页面大小变化

2025-12-16
浏览次数:
返回列表
Blazor通过JS Interop监听window.resize事件:先在JS端注册监听器并调用.NET方法,再在C#组件中定义OnResize回调更新状态并重渲染。

blazor 怎么监听页面大小变化

Blazor 本身不直接提供内置的 window.resize 事件绑定机制,但可以通过 J*aScript 互操作(JS Interop)监听浏览器窗口大小变化,并把尺寸数据传回 C# 组件。整个过程分三步:注册 JS 监听器、定义回调方法、在组件中更新状态。

用 JS Interop 注册 resize 监听器

需要在 J*aScript 端设置一个监听函数,在窗口大小变化时调用 .NET 方法。推荐在 `_Host.cshtml` 或 `index.html` 的 `<script>` 中添加: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:js;toolbar:false;'>window.blazorHelpers = { registerResizeListener: (dotNetObjRef) =&gt; { const handleResize = () =&gt; { dotNetObjRef.invokeMethodAsync('OnResize', window.innerWidth, window.innerHeight); }; window.addEventListener('resize', handleResize); // 立即触发一次,确保初始尺寸正确 handleResize(); // 返回清理函数(可选,用于取消订阅) return () =&gt; window.removeEventListener('resize', handleResize); } };</pre></div><H3>在 Blazor 组件中接收并响应尺寸变化 组件里需定义: - 两个字段存宽高(如 `<a style="color:#f60; text-decoration:underline;" title= "win"href="https://www.php.cn/zt/19041.html" target="_blank">windowWidth`, `windowHeight`) - 一个 `IDisposable` 引用(便于后续取消监听) - `[JSInvokable]` 方法 `OnResize` 接收 JS 调用 - 调用 `StateHasChanged()` 触发重渲染 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:razor;toolbar:false;'>@page &quot;/resize-demo&quot; @inject IJSRuntime JSRuntime &lt;p&gt;当前宽度: @windowWidth&lt;/p&gt; &lt;div class=&quot;aritcle_card&quot;&gt; &lt;a class=&quot;aritcle_card_img&quot; href=&quot;/ai/895&quot;&gt; &lt;img src=&quot;https://img.php.cn/upload/ai_manual/000/000/000/175679995460121.png&quot; alt=&quot;晓象AI资讯阅读神器&quot;&gt; &lt;/a&gt; &lt;div class=&quot;aritcle_card_info&quot;&gt; &lt;a href=&quot;/ai/895&quot;&gt;晓象AI资讯阅读神器&lt;/a&gt; &lt;p&gt;晓象-AI时代的资讯阅读神器&lt;/p&gt; &lt;div class=&quot;&quot;&gt; &lt;img src=&quot;/static/images/card_xiazai.png&quot; alt=&quot;晓象AI资讯阅读神器&quot;&gt; &lt;span&gt;72&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;a href=&quot;/ai/895&quot; class=&quot;aritcle_card_btn&quot;&gt; &lt;span&gt;查看详情&lt;/span&gt; &lt;img src=&quot;/static/images/cardxiayige-3.png&quot; alt=&quot;晓象AI资讯阅读神器&quot;&gt; &lt;/a&gt; &lt;/div&gt; &lt;p&gt;当前高度: @windowHeight&lt;/p&gt; &lt;button @onclick=&quot;StartListening&quot;&gt;开始监听&lt;/button&gt; &lt;button @onclick=&quot;StopListening&quot;&gt;停止监听&lt;/button&gt; @code { private int windowWidth; private int windowHeight; private IDisposable? resizeListener; private async Task StartListening() { if (resizeListener is null) { resizeListener = await JSRuntime.InvokeUnmarshalled&lt;IDisposable&gt;( &quot;blazorHelpers.registerResizeListener&quot;, DotNetObjectReference.Create(this)); } } private void StopListening() { resizeListener?.Dispose(); resizeListener = null; } [JSInvokable] public void OnResize(int width, int height) { windowWidth = width; windowHeight = height; StateHasChanged(); } }</pre></div><H3>注意几个关键细节 - 不要用 `InvokeAsync` 调用 `registerResizeListener`,它返回的是 JS 函数,而 `InvokeUnmarshalled` 更适合这种无 Promise 的同步注册场景 - 初始尺寸必须手动触发一次(比如在 `handleResize()` 里),否则组件首次加载时宽高为 0 - `DotNetObjectReference.Create(this)` 需要手动 `Dispose()`,否则可能引发内存泄漏;建议在 `Dispose(bool)` 中也做清理 - 如果只是做<a style="color:#f60; text-decoration:underline;" title= "响应式布局"href="https://www.php.cn/zt/23291.html" target="_blank">响应式布局判断(比如区分手机/桌面),可在 `OnResize` 里加断点逻辑,例如: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:csharp;toolbar:false;'>public bool IsMobile =&gt; windowWidth &lt; 768; public string DeviceClass =&gt; IsMobile ? &quot;mobile&quot; : &quot;desktop&quot;;</pre></div><p>基本上就这些。不需要引入第三方包,纯原生 Blazor + JS 互操作就能稳定工作。</script>

以上就是Blazor 怎么监听页面大小变化的详细内容,更多请关注其它相关文章!


# 如何用  # 雨花营销网站建设  # 加盟网站推广员加盟费  # 烟台seo公司排行榜  # 郑州网站建设怎么优化  # 玉树抖音seo运营招聘  # 企业网站建设推广公司  # 阜新seo优化咨询热线  # 短视频seo系统源码  # 搜狐号网站建设  # 淘宝关键词排名怎么上去  # 就能  # 几个  # 的是  # 操作指南  # javascript  # 里加  # 如何处理  # 回调  # 它在  # 文档  # .net  # c#  # 响应式布局  # win  # ai  # 浏览器  # js  # html  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 使用J*aScript检测输入元素是否包含在特定类中  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  J*aScript数组对象转换:按指定键分组与值收集  理解Python模块与全局变量的作用域管理  VS Code远程开发时如何处理文件权限问题  c++中为什么推荐使用using替代typedef_c++现代化类型别名  Golang如何使用net/url解析URL_Golang URL解析与处理方法  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  PySpark中从现有列右侧提取可变长度字符创建新列的教程  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  Lar*el 递归关系中排除指定分支的教程  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  照顾宝贝2小游戏点击立即在线玩  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  poki网页游戏推荐_poki免费游戏平台入口  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  利用Bokeh CustomJS动态控制DataTable列可见性  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  Log4j Console Appender性能瓶颈与高并发优化策略  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  Django表单提交验证失败后保持字段值不刷新  痛风发作了怎么办? 快速止痛和后期饮食调理  Django表单验证失败时保留用户输入数据的最佳实践  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  如何提高微信支付的安全性_微信支付安全防护与设置建议  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  Pandas DataFrame 多条件优先级排序与排名  J*aScript实现单选按钮与关联输入框的联动禁用教程  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  126邮箱账号注册 电脑版登录入口  微信语音通话掉线如何解决 微信语音通话稳定优化方法  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  4399免费游戏网址入口 4399小游戏免费入口点开即玩  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  HTML长属性值处理:表单action路径优化与代码规范应对  苹果手机如何防止被恶意App追踪  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法 

搜索