You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms混合Blazor应用如何动态加载外部RCL组件的打包CSS文件?

解决WinForms混合Blazor动态加载未引用RCL的CSS问题

因为未被主项目引用的RCL不会自动将静态资源复制到主项目的_content目录,所以需要通过读取嵌入式资源+JS动态注入的方式加载CSS:

1. 配置RCL的CSS为嵌入式资源

在RCL项目中,将目标CSS文件的生成操作设置为「嵌入式资源」,也可以直接在RCL的.csproj中添加以下配置:

<ItemGroup>
  <EmbeddedResource Include="wwwroot\css\your-module-styles.css" />
</ItemGroup>

2. 从动态加载的RCL程序集中提取CSS内容

加载RCL程序集后,定位并读取嵌入式的CSS资源:

// 已加载的RCL程序集实例
Assembly rclAssembly = Assembly.LoadFrom(module);

// 查找CSS资源名(格式为「RCL命名空间.文件路径」,路径中的/替换为.)
string cssResourceName = rclAssembly.GetManifestResourceNames()
    .FirstOrDefault(name => name.EndsWith("wwwroot.css.your-module-styles.css"));

if (!string.IsNullOrEmpty(cssResourceName))
{
    // 读取CSS文件内容
    using Stream cssStream = rclAssembly.GetManifestResourceStream(cssResourceName);
    using StreamReader reader = new StreamReader(cssStream);
    string cssContent = reader.ReadToEnd();

    // 调用JS函数注入CSS到页面
    await JS.InvokeVoidAsync("injectDynamicCss", cssResourceName, cssContent);
}

3. 实现JS互操作函数注入CSS

在WinForms Blazor WebView对应的wwwroot/index.html中添加以下JS代码:

window.injectDynamicCss = function(resourceId, cssContent) {
    // 避免重复加载同一CSS
    if (document.getElementById(resourceId)) return;

    // 创建style标签并注入CSS内容
    const styleElement = document.createElement('style');
    styleElement.id = resourceId;
    styleElement.textContent = cssContent;
    document.head.appendChild(styleElement);
}

额外说明

  • 如果RCL的CSS依赖字体、图片等静态资源,需将这些资源同样设为嵌入式资源,再通过Data URI的方式替换CSS中的资源路径,或通过类似逻辑动态注入资源。
  • 若需要卸载模块时清理CSS,可以补充一个JS函数,根据resourceId找到对应的style标签并删除。

内容的提问来源于stack exchange,提问作者Anil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:35:06