首先,我是C#的新手
我正在尝试在C#winforms应用程序中执行类似的操作
当我的应用启动时,表单会在系统托盘中最小化。当我双击它时,它会打开并向qpid代理发送请求以获取一些信息。然后发送一条消息,并在我的应用程序中的监听器中接收(我不确定代码是否相关,但无论如何我都会发布)
namespace MyApp
{
public class MyListener : IMessageListener
{
public void MessageTransfer(IMessage m)
{
//do stuff with m
}
}
}
我正在尝试做的是使用该函数中收到的消息填充该表单中的列表框,但我不知道如何从MessageTransfer函数与该特定表单进行通信
答案 0 :(得分:5)
我建议你的听众不知道如何呈现消息。而是公开表单可以监听的事件:
// event args class for transmitting the message in the event
public class MessageEventArgs : EventArgs
{
public IMessage Message { get; private set; }
public MessageEventArgs(IMessage message)
{
Message = message;
}
}
在你的听众课程中:
public class MyListener : IMessageListener
{
public event EventHandler<MessageEventArgs> MessageReceived;
public void MessageTransfer(IMessage m)
{
OnMessageReceived(new MessageEventArgs(m));
}
protected void OnMessageReceived(MessageEventArgs e)
{
EventHandler<MessageEventArgs> temp = MessageReceived;
if (temp != null)
{
temp(this, e);
}
}
}
现在,您可以在表单中添加一个事件侦听器,并将消息信息添加到列表框或您喜欢的任何其他类型的控件中。
<强>更新强>
这是一个关于如何在表单中连接事件处理程序的示例。这段代码做了两个假设:
MessageReceived
在IMessageListener
界面IMessage
接口有一个名为Text
的属性。代码示例:
public partial class MainUI : Form
{
private IMessageListener _messageListener;
public MainUI()
{
InitializeComponent();
_messageListener = new MyListener();
_messageListener.MessageReceived += MessageListener_MessageReceived;
}
void MessageListener_MessageReceived(object sender, MessageEventArgs e)
{
_messageListBox.Items.Add(e.Message.Text);
}
}
答案 1 :(得分:1)
如果你的表单拥有监听器,最简单的方法是创建一个事件,监听器将为每个正在传输的消息上升。
将以下内容添加到您的侦听器类:
public delegate void MessageHandler(IMessage m);
public event MessageHandler MessageReceived;
将以下内容添加到MessageTransfer方法中:
if (MessageReceived != null)
MessageReceived(m);
现在,您可以在表单中为刚创建的事件附加方法:
初始化侦听器后,应在表单中放置以下行:
_listener.MessageReceived += new MessageHandler(Form1_MessageReceived);
我应该在表单中放置以下方法:
void Form1_MessageReceived(IMessage m)
{
// add the message to the list
}
如果侦听器在不同的线程上运行,还有一件事需要做,那就是在窗体线程中调用另一个方法来修改列表。