如何为 blazor 应用程序中的绑定变量设置后备值?

Posted

技术标签:

【中文标题】如何为 blazor 应用程序中的绑定变量设置后备值?【英文标题】:How to set a fallback value for bound variables in blazor application? 【发布时间】:2022-01-14 09:00:33 【问题描述】:

来自 WPF 开发,我正在使用 ASP.NET 和 Blazor,但我在理解以下内容时遇到了一些麻烦: 例如,我想将 CSS 类值绑定到代码隐藏类的属性。

@inherits TextGenerator
<style>
    .mycssclass
    
        opacity: @TextOpacity;
        transition: opacity 2s;
    
</style>
<div class="modal-dialog-centered">
    <h1>@Text</h1>
</div>

这是代码隐藏类的样子:

public class TextGenerator : ComponentBase

    public event Func<Task> OnPropertyChanged;

    private string _text;
    public string Text 
     
        get
        
            return _text;
        
        set
        
            _text = value;
            OnPropertyChanged.Invoke();

        
    

    private float _textOpacity;
    public float TextOpacity
    
        get
        
            return _textOpacity;
        
        set
        
            _textOpacity = value;
            OnPropertyChanged.Invoke();

        
    

    protected async Task StartTextSlideShow()
    
        Text = "";
        TextOpacity = 1.0f;
        for (int i = 0; i < 1000; i++)
        
            Text = "Test #" + i.ToString();
            await Task.Delay(100);
        
    

    protected override void OnInitialized()
    
        OnPropertyChanged += PropertyChange;
        _ = StartTextSlideShow();
    

    public async Task PropertyChange()
    
        await InvokeAsync(() =>
        
            StateHasChanged();
        );
    

我的问题如下:如何设置不透明度的初始值或后备值?例如,在这种情况下,我希望将不透明度初始化为0,这样当我在StartTextSlideShow() 中将其设置为1.0f 时,文本就会淡入。

【问题讨论】:

我删除了我的第一个答案,因为它不正确。问题:是否要启动“幻灯片”并在页面初始化时淡入?如果不是怎么触发呢? 您好抱歉回复晚了,明天我会检查一切并在测试后回答 至于淡入 - 确切地说:我基本上希望页面加载,然后文本淡入。作为最终结果,我想到了一些看起来像在初始 Windows 10 中看到的文本setup (“这可能需要几分钟......”等)。此外,我在背景中有一个视频,它应该会慢慢淡入。如前所述,这只是我玩弄网络内容.. :) 【参考方案1】:

这是一个类似的答案,它会在您的幻灯片中显示并为每张伪图片淡入。

剃刀密码:

@page "/Text"
<style>
    .mycssclass
    
        opacity: @_opacity;
        transition: opacity @_transition;
    
</style>

<div class="modal-dialog-centered mycssclass @_cssClass  p-5">
    <h1 class="">@_text</h1>
</div>

以及背后的代码:

using Microsoft.AspNetCore.Components;
using System.Timers;

namespace ***.Server.Pages

    public partial class TextGenerator : ComponentBase
    
        System.Timers.Timer _timer = new System.Timers.Timer();

        private string _text = "Slide Show Starting";
        private decimal _opacity = 0m;
        private string _transition = "0s";
        private int _counter = 0;

        private int _pictureCount = 5;

        private string _cssClass = "bg-white text-white-500 border border-secondary";

        protected override void OnInitialized()
        
            _opacity = 1m;
            _transition = "2s";
            _timer.Interval = 4000;
            _timer.AutoReset = true;
            _timer.Elapsed += TimerElapsed;
            _timer.Start();
        

        public async void TimerElapsed(Object? sender, System.Timers.ElapsedEventArgs e)
        
            _cssClass = "bg-primary text-white";
            _counter++;
            _opacity = 0m;
            _transition = "0s";
            await this.InvokeAsync(StateHasChanged);
            await Task.Delay(1);
            _text = $"Picture _counter";
            _opacity = 1m;
            _transition = "2s";
            await this.InvokeAsync(StateHasChanged);
            if (_counter >= _pictureCount)
                _timer.Stop();
        
    

【讨论】:

【参考方案2】:

我的问题如下:如何设置不透明度的初始值或后备值?例如,在这种情况下,我希望将不透明度初始化为 0,

public float TextOpacity  get; set;  = 0.0f;

这样当我在 StartTextSlideShow() 中将其设置为 1.0f 时

就这样做吧:

public float TextOpacity  get; set;  = 1.0f;

注意:以上是您问题的完整答案...

这是一个代码示例,我将如何使用计时器在 Blazor Server 应用程序中实现您的 TextGenerator。复制并测试...

BlazorTimer.cs

using System.Timers;

public class BlazorTimer
    
        private Timer _timer;

        internal void SetTimer(double interval)
        
            _timer = new Timer(interval);
            _timer.Elapsed += NotifyTimerElapsed;
            _timer.Enabled = true;
            _timer.Start();
        

     private void NotifyTimerElapsed(object sender, ElapsedEventArgs e)
        
            OnElapsed?.Invoke();
        

        public event Action OnElapsed;
     

Startup.ConfigureServices

 public void ConfigureServices(IServiceCollection services)
        
           // Code removed ...

            services.AddTransient(config =>
            
                var blazorTimer = new BlazorTimer();
                blazorTimer.SetTimer(100);
                return blazorTimer;
            );
        

用法: Index.razor

@page "/"
@implements IDisposable

@inject BlazorTimer Timer

<style>
    .mycssclass
    
         opacity: @TextOpacity;
         transition: opacity 2s;
     
</style>
<div class="modal-dialog-centered">
     <h1 class="mycssclass">@Text</h1>
</div>


@code

    private int i = 0;

    protected override void OnInitialized()
    
        Timer.OnElapsed += NotifyTimerElapsed;

        base.OnInitialized();
    

    public string Text  get; set; 
    public float TextOpacity  get; set;  = 1.0f;

    private void NotifyTimerElapsed()
    
        InvokeAsync(() =>
        
           Text = $"Test #i++"; TextOpacity -= TextOpacity / 100; StateHasChanged();
        );
    

    public void Dispose()
    

    

【讨论】:

以上是关于如何为 blazor 应用程序中的绑定变量设置后备值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Blazor 服务器应用设置显示宽度?

如何为 Blazor WebAssembly 和 IdentityServer 4 配置持久登录?

如何为 Blazor Web Assembly 实现缓存清除

如何为 SqlDataSource 动态绑定变量参数

如何为django中的按钮绑定事件

如果绑定源为null,如何为Image设置默认源?