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

如何在DevExpress XAF中创建带WebSocket发送的无业务对象绑定弹窗?

在XAF中添加无业务对象绑定的WebSocket通信UI

完全可行,不需要绑定任何业务对象就能实现。核心是使用无业务对象依赖的通用ViewController,而非需要指定实体类型的ObjectViewController<T>。以下是具体实现步骤:

1. 创建通用ViewController

创建继承自ViewController的控制器,这类控制器不依赖任何业务对象,可在所有视图中激活(也可指定特定视图范围)。

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;

public class WebSocketCommController : ViewController
{
    public WebSocketCommController()
    {
        // 添加操作按钮到视图工具栏
        var sendMsgAction = new SimpleAction(this, "SendWebSocketMessage", "View");
        sendMsgAction.Caption = "发送WebSocket消息";
        sendMsgAction.Execute += SendMsgAction_Execute;
    }

    private void SendMsgAction_Execute(object sender, SimpleActionExecuteEventArgs e)
    {
        // 弹窗与消息发送逻辑写在这里
    }
}

2. WinForms端实现自定义弹窗

在按钮的Execute事件中,创建包含文本框和发送按钮的DevExpress风格弹窗:

using DevExpress.XtraEditors;
using System.Windows.Forms;

private void SendMsgAction_Execute(object sender, SimpleActionExecuteEventArgs e)
{
    using (var popupForm = new XtraForm())
    {
        popupForm.Text = "发送WebSocket消息";
        popupForm.Size = new System.Drawing.Size(400, 150);
        popupForm.StartPosition = FormStartPosition.CenterParent;

        // 消息输入框
        var msgInput = new TextEdit();
        msgInput.Dock = DockStyle.Top;
        msgInput.Margin = new Padding(10);
        msgInput.Properties.NullText = "请输入消息内容";
        popupForm.Controls.Add(msgInput);

        // 发送按钮
        var sendBtn = new SimpleButton();
        sendBtn.Dock = DockStyle.Bottom;
        sendBtn.Text = "发送";
        sendBtn.Click += (s, args) =>
        {
            if (!string.IsNullOrWhiteSpace(msgInput.Text))
            {
                // 调用已初始化的WebSocket客户端发送消息
                YourWebSocketClient.Send(msgInput.Text);
                XtraMessageBox.Show("消息已发送", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                popupForm.Close();
            }
        };
        popupForm.Controls.Add(sendBtn);

        popupForm.ShowDialog();
    }
}

3. Blazor端实现自定义弹窗

Blazor端可使用DevExpress的DxPopup组件,先创建自定义弹窗组件:

<!-- WebSocketMessagePopup.razor -->
<DxPopup @bind-Visible="@IsVisible" HeaderText="发送WebSocket消息" 
         BodyCssClass="p-3" SizeMode="SizeMode.Small">
    <BodyContent>
        <DxTextBox @bind-Text="@MessageContent" CssClass="mb-2" />
        <DxButton Text="发送" Click="@SendMessage" />
    </BodyContent>
</DxPopup>

@code {
    [Parameter] public bool IsVisible { get; set; }
    [Parameter] public EventCallback<bool> IsVisibleChanged { get; set; }
    private string MessageContent { get; set; }

    private async Task SendMessage()
    {
        if (!string.IsNullOrWhiteSpace(MessageContent))
        {
            // 调用WebSocket客户端发送消息
            await YourWebSocketClient.SendAsync(MessageContent);
            await IsVisibleChanged.InvokeAsync(false);
        }
    }
}

然后在控制器中触发弹窗:

using DevExpress.ExpressApp.Blazor;
using DevExpress.ExpressApp.Blazor.Templates;
using Microsoft.Extensions.DependencyInjection;

private void SendMsgAction_Execute(object sender, SimpleActionExecuteEventArgs e)
{
    var template = (ISupportActionsToolbar)Frame.Template;
    var popupService = template.ServiceProvider.GetRequiredService<IPopupService>();
    var popupOptions = new PopupOptions { Size = new Size(400, 160) };
    popupService.ShowPopup<WebSocketMessagePopup>(popupOptions);
}

关键注意事项

  • 确保WebSocket客户端实例全局可访问(比如通过依赖注入注册为单例),方便在弹窗中调用发送方法。
  • 可通过控制器的TargetViewType/TargetViewId属性限制按钮的显示范围,避免在所有视图中出现。

内容的提问来源于stack exchange,提问作者doubler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:52:36