【问题标题】:Blazor .Net + Dispatcher.BeginInvoke( )?Blazor .Net + Dispatcher.BeginInvoke()?
【发布时间】:2023-03-10 07:09:01
【问题描述】:

是否可以使用新的 Blazor 框架执行以下操作?

我有一个显示人员列表的页面。该列表本质上是一个可绑定的 Person 对象列表。

期望的结果 我想显示每个人彼此独立淡入。

例如:第一行首先开始淡入。第 N 行的人将是最后一个淡入的人。

我尝试了什么 我使用 Task.Delay() 尝试了几件事,并试图让 Dispatcher.BeginInvoke() 工作。

但现在我开始认为,如果不进行某种 hack,这是不可能的。

这种效果甚至可以通过 Blazor 实现吗?有没有 Dispatcher.BeginInvoke() 等效?

【问题讨论】:

  • Dispatcher 和 Task.Delay 用于多线程环境。 Blazor 目前的形式是单线程的。您可能必须使用一些 jquery 或 css 才能获得所需的效果。

标签: .net .net-core dispatcher begininvoke blazor


【解决方案1】:

如果您的Blazor 应用程序在客户端运行,一个选项是使用CSS3 animations 的组合淡入行和Task.Delay 的组合来延迟添加行。

我会根据默认的Blazor(.NET core 3.0 preview 3)模板给大家举个例子。

this SO answer 的启发,您可以将以下CSS class 添加到您的site.css 或一些自定义CSS 文件中:

.fadein {
    -webkit-animation: fadein 1s; /* Safari, Chrome and Opera > 12.1 */
    -moz-animation: fadein 1s; /* Firefox < 16 */
    -ms-animation: fadein 1s; /* Internet Explorer */
    -o-animation: fadein 1s; /* Opera < 12.1 */
    animation: fadein 1s;
}

@keyframes fadein {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

/* Firefox < 16 */
@-moz-keyframes fadein {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

/* Safari, Chrome and Opera > 12.1 */
@-webkit-keyframes fadein {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

/* Internet Explorer */
@-ms-keyframes fadein {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

现在我们将修改 FetchData.razor 页面,该页面默认显示带有一些预测信息的 HTML 表。

首先我们为表格行&lt;tr&gt;添加一个样式类,如下所示:

@foreach (var forecast in forecasts)
{
    <tr class="fadein">
        <td>@forecast.Date.ToShortDateString()</td>
        <td>@forecast.TemperatureC</td>
        <td>@forecast.TemperatureF</td>
        <td>@forecast.Summary</td>
    </tr>
}

接下来我们将forecasts的类型从array更改为List

List<WeatherForecast> forecasts = new List<WeatherForecast>();

作为最后一步,我们将 OnInitAsync 中的 forecasts 准备替换为以下调用:

protected override async Task OnInitAsync()
{
    await FadeInItems();
}

并添加延迟淡入的方法:

private async Task FadeInItems()
{
    var items = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json");

    // don't forget to use the desired sorting / filtering on your collection
    foreach (var item in items)
    {
        forecasts.Add(item);
        base.StateHasChanged();
        await Task.Delay(500);
    }
}

这应该是你的结果:

基于此演示,您现在应该能够将此方法应用于您的Person 模型和单个剃须刀页面。当然动画、延迟等只是一个例子,可以自定义。

【讨论】:

  • 谢谢。这是非常非常彻底的! base.StateHasChanged(); 在哪里?是从哪里来的?
  • 另外,我的异步函数在视图模型中。并且编译器抱怨我不能直接等待任务而不调用 ConfigureAwait。
  • StateHasChanged() 指示 Blazor 使用 WASM 呈现页面,因为状态已更改。您可以在 ViewModel 中调用异步方法,只需将默认的 protected override void OnInit() 替换为 protected override Task OnInitAsync(),就像上面的示例一样。
  • 有两种方法:要么将页面的基类传递给 ViewModel,要么将事件 ViewModelChanged 添加到 ViewModel 并让页面订阅它,每当 ViewModel 更改时调用 StateHasChanged .我现在正在旅行,以后可以给你举个例子,邀请我去SO聊天室保持cmets短裤。
  • 您好 Raul,我已使用调试输出编译所有内容,以验证延迟添加对象。确实,他们的行为符合我的预期。但是,UI 的所有对象同时淡入。有任何想法吗?顺便说一句 - 我必须做 Task.Delay(500).ConfigureAwait(true)
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多