如何在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
相关产品推荐
相关产品推荐

