如何将现有的`Blazor`项目的主题切换写的更好看?

如何将现有的Blazor项目的主题切换写的更好看?

在现有的系统当中,我们的主题切换会比较生硬,下面我们将基于Masa Blazor实现好看的扩散主题切换的样式效果。

安装MASA.Template

dotnet new install MASA.Template
175882388586dc4541263b3f202f144c.png

创建Masa Blazor项目

打开vs2022

480d6ddf4403cbc67b9794f7cd426551.png

选择server app模板

打开wwwroot/css/site.css

ffb58eb2b91637314fa37bbc147712a6.png

添加一下代码,这个代码是核心样式实现。animation: clip .5s ease-in;的.5s则是扩散时间。

::view-transition-old(root) {
    animation: none;
}
::view-transition-new(root) {
    mix-blend-mode: normal;
    animation: clip .5s ease-in;
}

@keyframes clip {
    from {
        clip-path: circle(0% at var(--x) var(--y));
    }
    to{
        clip-path: circle(100% at var(--x) var(--y));
    }
}

打开Pages/_Host.cshtml

添加以下代码,请添加到body的内部的最尾部的位置。

<script>
        window.switchTheme = function (dotNetHelper, x, y) {
            document.documentElement.style.setProperty('--x', x + 'px')
            document.documentElement.style.setProperty('--y', y + 'px')
            document.startViewTransition(() => {
                dotNetHelper.invokeMethodAsync('SwitchTheme');
            });
            
        }
    </script>

这个方法向window添加一个switchTheme的js方法,需要传递调用的实例,x,y则是扩散的开始位置,

然后会创建一个css的变量,这个变量对应到上面的clip里面的var(--x)和var(--y)

打开Shared\MainLayout.razor,修改成以下代码

@inherits LayoutComponentBase
@inject GlobalConfig GlobalConfig
@inject IJSRuntime JsRuntime
@inject MasaBlazor MasaBlazor

<MApp >
    <PPageTabsProvider>
        <CascadingValue Value="GlobalConfig.Culture.Name" Name="CultureName">
            <MAppBar  Elevation=0 App Height="100" Class="default-app-bar mx-6">
                 <div class="default-app-bar__actions @PageModeClass">
                     <Favorite />
                     <MSpacer />
                     <Search />
                     <MIcon Size=20 Class="ml-5" Color="neutral-lighten-3">mdi-message-processing-outline</MIcon>
                     <MIcon Size=20 Class="ml-5" Color="neutral-lighten-3" OnClick="() => _showSetting = true">mdi-cog-outline</MIcon>
                     <Language OnLanguageChanged="OnLanguageChanged" />
                     <MButton OnClick="ClickSwitchTheme">切换</MButton>
                     <Login />
                 </div>
                 <div class="default-app-bar__nav @PageModeClass">
                     @if (_pageTab == PageModes.PageTab)
                    {
                        <PageTabs @ref="_pageTabs" SelfPatterns="@s_selfPatterns" />
                    }
                    else
                    {
                        <Breadcrumb />
                    }
                </div>
            </MAppBar>

            <Navigation />

            <MMain Class="fill-lighten-1">
                <div class="pa-6">
                    @if (_pageTab == PageModes.PageTab)
                    {
                        <PPageContainer PageTabs="@_pageTabs?.PPageTabs" SelfPatterns="@s_selfPatterns">
                            @Body
                        </PPageContainer>
                    }
                    else
                    {
                        @Body
                    }
                </div>
            </MMain>
            <Settings @bind-PageModel="_pageTab" @bind-Show=_showSetting />
        </CascadingValue>
    </PPageTabsProvider>
</MApp>

@code {

    private DotNetObjectReference<MainLayout>? objRef;

    private bool dark = false;

    private static readonly string[] s_selfPatterns =
    {
        "/app/todo"
    };

    private bool? _showSetting;

    private string? _pageTab;

    private PageTabs? _pageTabs;

    private string PageModeClass => _pageTab == PageModes.PageTab ? "page-mode--tab" : "page-mode--breadcrumb";

    protected override void OnInitialized()
    {
        objRef = DotNetObjectReference.Create(this);
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        await base.OnAfterRenderAsync(firstRender);

        if (firstRender)
        {
            await GlobalConfig.InitFromStorage();
        }
    }

    void OnLanguageChanged(CultureInfo culture)
    {
        GlobalConfig.Culture = culture;
    }

    private void ClickSwitchTheme(MouseEventArgs args)
    {
        _ = JsRuntime.InvokeVoidAsync("switchTheme", objRef, args.ClientX, args.ClientY);
    }

    [JSInvokable]
    public void SwitchTheme()
    {
        dark = !dark;
        MasaBlazor.ToggleTheme();
    }

}

在这里我们提供了SwitchTheme用于提供个js调用从而切换主题。

我们在原有的基础上添加了一个按钮,并且这个按钮点击会触发ClickSwitchTheme事件,然后通过JsRuntim调用js的方法,并且将当前实例传递到js,args.ClientX,args.ClientY则是点击的位置,我们会用点击的位置作为扩散的位置。

下面是运行效果,由于Masa Pro并没有适配暗夜效果,所以看的并不明显。如果你想看到更好的效果可以查看open666.cn

2ffaaa702c454e3cd1394f0a5518d77b.gif

这是使用的简单Demo的效果。1b7e2959fa04f7d183130c1146055884.gif

技术交流群:

BlazorQQ群:452761192

来自token的分享。

您可以按照以下步骤将Blazor Server项目配置为WinForms应用程序: 1. 在Visual Studio中打开Blazor Server项目。 2. 在解决方案资源管理器中,右键单击项目并选择“添加”>“新建项”。 3. 在“添加新项”对话框中,选择“WinForms应用程序”并设置名称和位置。 4. 在WinForms应用程序项目中,打开Program.cs文件并添加以下代码: ``` public static class Program { [STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("app"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); var host = builder.Build(); Application.Run(new MainForm(host)); } } ``` 5. 创建一个新的WinForms窗体,并添加以下代码: ``` public partial class MainForm : Form { private readonly WebAssemblyHost _host; public MainForm(WebAssemblyHost host) { InitializeComponent(); _host = host; } private void MainForm_Load(object sender, EventArgs e) { _host.RunAsync(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { _host.Dispose(); } } ``` 6. 在MainForm.Designer.cs文件中,将窗体的“AutoScaleMode”属性设置为“Dpi”。 7. 在Blazor Server项目中,打开Startup.cs文件并添加以下代码: ``` public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); }); } ``` 8. 在WinForms应用程序项目中,右键单击“引用”并选择“添加引用”。 9. 在“引用管理器”中,选择“项目”并选择Blazor Server项目。 10. 在“引用管理器”中,右键单击Blazor Server项目并选择“属性”。 11. 在“属性”窗口中,将“输出类型”设置为“类库”。 12. 在WinForms应用程序项目中,打开“应用程序配置文件”(app.config)并添加以下代码: ``` <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.AspNetCore.SignalR.Client.Core" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> ``` 13. 在WinForms应用程序项目中,右键单击“应用程序”并选择“属性”。 14. 在“应用程序”窗口中,将“启动对象”设置为“Program”。 15. 构建WinForms应用程序。 现在,您已经将Blazor Server项目配置为WinForms应用程序。运行应用程序时,将显示一个WinForms窗体,其中包含Blazor Server应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值