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

Blazor Server应用中实现Fluent UI数字面板对话框并正确返回输入值的问题

Blazor Server应用中实现Fluent UI数字面板对话框并正确返回输入值的问题

我完全理解你的困扰——做触摸面板的数字输入时,好不容易搭好了Fluent UI的数字面板对话框,结果点击OK拿不到用户输入的值,确实挺让人头疼的。问题的根源其实是你虽然实现了IDialogContentComponent<string>接口,但没有处理对话框主按钮(OK)的回调逻辑,导致默认情况下对话框不会把你的面板输入值作为结果返回。

下面是具体的解决方案,分两步修改:

1. 完善数字面板组件(NumPadPanel.razor)的对话框回调逻辑

你需要在NumPadPanel中实现IDialogContentComponent<string>接口要求的主/次要按钮回调方法,主动把当前输入的Content值作为对话框结果返回。修改后的完整代码如下:

@implements IDialogContentComponent<string>
<FluentDialogBody>
    <FluentTextField ReadOnly="true" Style="width: 250px" @bind-Value="Content" /><br />
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 1))">1</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 2))">2</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 3))">3</FluentButton><br />
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 4))">4</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 5))">5</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 6))">6</FluentButton><br />
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 7))">7</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 8))">8</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 9))">9</FluentButton><br />
    <FluentButton Class="num-pad-btn" @onclick="ClearInput">Clear</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="@((e) => AddDigit(e, 0))">0</FluentButton>
    <FluentButton Class="num-pad-btn" @onclick="Backspace">Backspace</FluentButton><br />
</FluentDialogBody>

@code {
    [Parameter]
    public string Content { get; set; } = string.Empty;

    public void AddDigit(MouseEventArgs e, int digit)
    {
        Content += digit.ToString();
        StateHasChanged();
    }

    public void ClearInput()
    {
        Content = string.Empty;
    }

    public void Backspace()
    {
        if (Content.Length > 0)
        {
            Content = Content.Substring(0, Content.Length - 1);
        }
    }

    // 新增:处理OK按钮点击,返回当前输入的内容
    public Task<DialogResult> OnPrimaryActionAsync()
    {
        return Task.FromResult(DialogResult.Ok(Content));
    }

    // 新增:处理Cancel按钮点击,返回取消结果
    public Task<DialogResult> OnSecondaryActionAsync()
    {
        return Task.FromResult(DialogResult.Cancel());
    }
}

核心变化是添加了两个接口要求的回调方法:

  • 点击OK时,通过DialogResult.Ok(Content)把当前输入的数字字符串作为结果返回
  • 点击Cancel时,返回取消状态,和你的原有逻辑保持一致

2. 优化宿主组件的输入框(可选但推荐)

为了彻底避免弹出系统软键盘,建议你把宿主组件中的FluentTextField设置为ReadOnly="true",这样点击输入框时只会触发打开对话框的事件,不会唤起系统软键盘:

<FluentTextField Label="kW Command" Appearance="FluentInputAppearance.Outline" Value="@RealPowerCmd" Style="width: 75px" @onclick="OpenDialogRealPower" ReadOnly="true" />

测试验证

修改完成后,当你在数字面板输入内容并点击OK,宿主组件中的result.Data就能正确拿到用户输入的字符串,最终赋值给RealPowerCmd并更新UI了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:34:31