C# Blazor WebAssembly : Argument 2: cannot convert from 'void' to 'Microsoft.AspNetCore.Components.EventCallback'

标签 c# blazor blazor-webassembly

我是 blazor C# 的新手,正在尝试制作一个简单的倒数计时器网站。我的网站包括:

  • 显示计时器的文本
  • 启动和停止按钮
  • 用于设置计时器的按钮

  • 我在设置计时器的按钮上遇到了问题。当我点击它时,它不会设置计时器显示并且我收到一个错误 Argument 2: cannot convert from 'void' to 'Microsoft.AspNetCore.Components.EventCallback' .我在 Youtube 上搜索 EventCallback 主题,但问题是,我的组件没有分离,而在视频中,示例代码将分离的组件链接在一起。这是代码。
    Index.razor
    @page "/"
    @inherits FrontEnd.Components.Timer
    
    <h1>Timer</h1>
    
    <p class="timer">@Hours.ToString("00"):@Minutes.ToString("00"):@Seconds.ToString("00")</p>
    @foreach (var timer in timerCollections)
    {
        // Here's the problem
        <button @onclick="SetTimer(timer.Id)">@timer.Hours.ToString("00"):@timer.Minutes.ToString("00"):@timer.Seconds.ToString("00")</button>
    }
    <br/>
    <button @onclick="StartTimer" disabled=@StartButtonIsDisabled>Start</button>
    <button @onclick="StopTimer" disabled=@StopButtonIsDisabled>Stop</button>
    
    Timer.cs
    using System;
    using System.Timers;
    using System.Collections.Generic;
    using Microsoft.AspNetCore.Components;
    
    namespace FrontEnd.Components
    {
        public class TimerStructure
        {
            public int Id { get; set; }
            public int Hours { get; set; }
            public int Minutes { get; set; }
            public int Seconds { get; set; }      
        }
        public class Timer : ComponentBase
        {
            public List<TimerStructure> timerCollections = new List<TimerStructure>(){
                new TimerStructure(){ Id = 1, Hours = 0, Minutes = 30, Seconds = 0 },
                new TimerStructure(){ Id = 2, Hours = 1, Minutes = 0, Seconds = 0 }
            };
    
            public int Index { get; private set; }
            public int Hours { get; set; } = 0;
            public int Minutes { get; set; } = 0;
            public int Seconds { get; set; } = 0;
            public bool StopButtonIsDisabled { get; set; } = true;
            public bool StartButtonIsDisabled { get; set; } = false;
            private static System.Timers.Timer aTimer;
            // and this is the function related to the problem
            public void SetTimer(int value)
            {
                this.Index = value - 1;
                Hours = timerCollections[Index].Hours;
                Minutes = timerCollections[Index].Minutes;
                Seconds = timerCollections[Index].Seconds;
            }
            public void StopTimer()
            {
                aTimer.Stop();
                aTimer.Dispose();
    
                StopButtonIsDisabled = true;
                StartButtonIsDisabled = false;
    
                Console.WriteLine($"{Hours}:{Minutes}:{Seconds}");
            }
            public void StartTimer() 
            {
                aTimer = new System.Timers.Timer(1000);
                aTimer.Elapsed += CountDownTimer;
                aTimer.Start(); 
    
                StopButtonIsDisabled = false;   
                StartButtonIsDisabled = true;
            }
            public void CountDownTimer(Object source, ElapsedEventArgs e)
            {
                if(Seconds == 0 && Minutes > 0)
                {
                    Minutes -= 1;
                    Seconds = 59;
                } else if (Minutes == 0 && Seconds == 0 && Hours > 0)
                {
                    Hours -= 1;
                    Minutes = 59;
                    Seconds = 59;
                } else if (Hours == 0 && Minutes == 0 && Seconds == 0)
                {
                    aTimer.Stop();
                    aTimer.Dispose();
    
                    StopButtonIsDisabled = true;
                    StartButtonIsDisabled = false;
                } else
                {
                    Seconds -= 1;
                }
                InvokeAsync(StateHasChanged);
            }
        }
    }
    

    最佳答案

    试试:<button @onclick="() => SetTimer(timer.Id)">

    关于C# Blazor WebAssembly : Argument 2: cannot convert from 'void' to 'Microsoft.AspNetCore.Components.EventCallback' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64962821/

    相关文章:

    c# - Entity Framework 6 渴望加载具有许多子项和子项的大对象

    c# - 启用 MSI 时连接到 SQL

    c# - 如何在 UWP 中查找 UI 线程

    c# - 如何在 Visual Studio 2019 中添加 .mdf 文件?

    c# - 迁移到 .NET Core 6 后 Blazor PageTitle 标签不起作用

    c# - Blazor Valued 在保持双向绑定(bind)的同时发生了变化

    c# - 使用 Json.net 将 Json 转换为 C# 对象

    blazor - 如何减少 Blazor Webassembly 的加载时间

    c# - .NET CORE依赖注入(inject)将参数传递给构造函数

    ubuntu - 如何将 ABP 框架应用程序部署到 Ubuntu 服务器?