C# 在两个wpf窗口之间发送信息

C# 在两个wpf窗口之间发送信息,c#,wpf,chat,active-window,C#,Wpf,Chat,Active Window,我们打开了两个窗口,就像聊天一样 这是文本框和按钮的外观: private void textBox_chat_TextChanged(object sender, TextChangedEventArgs e) { } private void button_enviar_Click(object sender, RoutedEventArgs e) { string chatMessage = textBox_chat.Text; } 我想知道如何通过按下按钮“button_e

我们打开了两个窗口,就像聊天一样

这是文本框和按钮的外观:

private void textBox_chat_TextChanged(object sender, TextChangedEventArgs e)
{
}

private void button_enviar_Click(object sender, RoutedEventArgs e)
{
    string chatMessage = textBox_chat.Text;
}
我想知道如何通过按下按钮“button_enviar”发送插入文本框中的信息。并打印到另一个窗口。 我一直在寻找类似于
Application.Current.Windows
。。。但仍然没有找到成功的方法

我的代码实际上如下所示:

主窗口

   namespace WpfApplication1
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            // automatic code generated by the button
            private void button_entrar_Click(object sender, RoutedEventArgs e)
            {
                // we catch the taxt input in the texBox
                string userLoginName = textBox_pantalla_inicial.Text;

                // We call the chat window
                Window window1 = new Window1();
                // we put the user name as the title of the chat window
                window1.Title = userLoginName;
                // show the chat window
                window1.Show();            
            }       
        }
    }
命名空间WpfApplication1
{
/// 
///Lógica de interacción para main window.xaml
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
//由按钮生成的自动代码
私有无效按钮\u进入者\u单击(对象发送者,路由目标)
{
//我们在文本框中捕获taxt输入
字符串userLoginName=textBox\u pantalla\u inical.Text;
//我们称之为聊天窗口
Window window1=新window1();
//我们将用户名作为聊天窗口的标题
window1.Title=userLoginName;
//显示聊天窗口
window1.Show();
}       
}
}
聊天窗口

namespace WpfApplication1
{
    /// <summary>
    /// Lógica de interacción para Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            // inicialize chatWindow
            InitializeComponent();            
        }

        private void textBox_chat_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void button_enviar_Click(object sender, RoutedEventArgs e)
        {
            string chatMessage = textBox_chat.Text;

        }       

        private void button_erase_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}
命名空间WpfApplication1
{
/// 
///Lógica de interacción para Window1.xaml
/// 
公共部分类Window1:Window
{
公共窗口1()
{
//使聊天窗口个性化
初始化组件();
}
私有无效文本框\聊天\文本更改(对象发送者,文本更改开发者)
{
}
私有无效按钮\u环境\u单击(对象发送者,路由目标)
{
字符串chatMessage=textBox\u chat.Text;
}       
私有无效按钮\u擦除\u单击(对象发送方,路由目标)
{
}
}
}

首先,您应该研究与XAML的绑定,例如。这样,在C#代码中,您就不需要关心所使用的UI控件——如果您不喜欢某些东西或希望改进窗口,您可以轻松地在XAML中更改这些控件

您只需要将MainWindow和ChatWindow视为对象。有很多方法可以使这项工作。最简单的方法之一是在聊天窗口中设置一个事件,主窗口在创建聊天窗口时订阅该事件。每当用户输入消息时,聊天窗口都会引发事件并通过事件中的参数传递文本,主窗口会捕获该事件,然后可以在其跟踪的所有聊天窗口中调用方法(或设置属性),以便将消息传递到所有聊天窗口

一个简单的示例(自由类型,未测试):

公共类主窗口:窗口
{
列表聊天窗口=新建列表();
公共无效AddChatWindow()
{
ChatWindow win=新建聊天窗口();
win.NewMessage+=MessageReceived;
win.Show();
添加(win);
}
接收到无效消息(对象发送方,MessageEventArgs e)
{
ChatWindow me=作为聊天窗口的发件人;
如果(me!=null)
{
foreach(在聊天窗口中赢得聊天窗口)
{
如果(赢!=我)
{
win.Add(e.Message);
}
}
}
}
}
公共类聊天窗口:窗口
{
公共事件处理程序NewMessage;
公共无效添加(字符串消息)
{
消息+=消息;
}
公共void UpdateText(字符串文本)
{
if(NewMessage!=null)
{
NewMessage(这个,newmessageeventargs(Message=text));
}
}
公共字符串消息{get;set;}
}
公共类MessageEventArgs:EventArgs
{
公共字符串消息{get;set;}
}

首先,您应该研究与XAML的绑定,例如。这样,在C#代码中,您就不需要关心所使用的UI控件——如果您不喜欢某些东西或希望改进窗口,您可以轻松地在XAML中更改这些控件

您只需要将MainWindow和ChatWindow视为对象。有很多方法可以使这项工作。最简单的方法之一是在聊天窗口中设置一个事件,主窗口在创建聊天窗口时订阅该事件。每当用户输入消息时,聊天窗口都会引发事件并通过事件中的参数传递文本,主窗口会捕获该事件,然后可以在其跟踪的所有聊天窗口中调用方法(或设置属性),以便将消息传递到所有聊天窗口

一个简单的示例(自由类型,未测试):

公共类主窗口:窗口
{
列表聊天窗口=新建列表();
公共无效AddChatWindow()
{
ChatWindow win=新建聊天窗口();
win.NewMessage+=MessageReceived;
win.Show();
添加(win);
}
接收到无效消息(对象发送方,MessageEventArgs e)
{
ChatWindow me=作为聊天窗口的发件人;
如果(me!=null)
{
foreach(在聊天窗口中赢得聊天窗口)
{
如果(赢!=我)
{
win.Add(e.Message);
}
}
}
}
}
公共类聊天窗口:窗口
{
公共事件处理程序NewMessage;
公共无效添加(字符串消息)
{
消息+=消息;
}
公共void UpdateText(字符串文本)
{
if(NewMessage!=null)
{
NewMessage(这个,newmessageeventargs(Message=text));
}
}
公共字符串消息{get;set;}
}
公共类MessageEventArgs:EventArgs
{
公共字符串消息{get;set;}
}

我设置了一个使用事件的小示例代码:

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    ChatMsgDispacher _chatMsgDispacher = new ChatMsgDispacher();
    public ChatChild GetNewChat()
    {
        var child = new ChatChild(); //or where you create the child
        child.SetMsgDispacher(_chatMsgDispacher);
        return child;
    }
}

public class ChatMsgDispacher
{
    public delegate void ChatMsgDelegate(string msg);
    public event ChatMsgDelegate MessageUpdate;

    public void Update(string msg)
    {
        if (MessageUpdate != null)
        {
            MessageUpdate(msg);
        }
    }
}


public class ChatChild
{
    private ChatMsgDispacher _msgDispacher;

    public void SetMsgDispacher(ChatMsgDispacher msgDispacher)
    {
        _msgDispacher = msgDispacher;
        _msgDispacher.MessageUpdate += MsgDispacher_MessageUpdate;
    }

    void MsgDispacher_MessageUpdate(string msg)
    {
        //add the msg in the child view
    }

    private void button_enviar_Click(object sender, RoutedEventArgs e)
    {
        string chatMessage = textBox_chat.Text;
        _msgDispacher.Update(chatMessage);
    }
}

我设置了一个使用事件的小示例代码:

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    ChatMsgDispacher _chatMsgDispacher = new ChatMsgDispacher();
    public ChatChild GetNewChat()
    {
        var child = new ChatChild(); //or where you create the child
        child.SetMsgDispacher(_chatMsgDispacher);
        return child;
    }
}

public class ChatMsgDispacher
{
    public delegate void ChatMsgDelegate(string msg);
    public event ChatMsgDelegate MessageUpdate;

    public void Update(string msg)
    {
        if (MessageUpdate != null)
        {
            MessageUpdate(msg);
        }
    }
}


public class ChatChild
{
    private ChatMsgDispacher _msgDispacher;

    public void SetMsgDispacher(ChatMsgDispacher msgDispacher)
    {
        _msgDispacher = msgDispacher;
        _msgDispacher.MessageUpdate += MsgDispacher_MessageUpdate;
    }

    void MsgDispacher_MessageUpdate(string msg)
    {
        //add the msg in the child view
    }

    private void button_enviar_Click(object sender, RoutedEventArgs e)
    {
        string chatMessage = textBox_chat.Text;
        _msgDispacher.Update(chatMessage);
    }
}

我会这样做:

public partial class ChatWindow : Window
{

    private Client client;
    public ChatWindow(Client _client)
    {
        InitializeComponent();
        client = _client;
        this.Title = client.Name + " chat";
        client.MessageReceived += OnMessageReceived;


        this.Loaded += OnLoaded;
    }

    public void OnMessageReceived(object sender, MessageReceivedArgs e)
    {
        chatControl.Text += e.Sender.Name+": "+ e.Message;
    }

    private void OnLoaded(object sender, EventArgs e)
    {
        client.Send("client " + client.Name + " is loaded!");
    }


}


public class Client{

    public string Name { get; set; }
    public Chat chat{get;set;}



    public Client(string name)
    {
        Name = name;
    }

    public delegate void MessageReceivedEventHandler(object sender, MessageReceivedArgs e);

    public event MessageReceivedEventHandler MessageReceived;

    private void RaiseMessageReceivedEvent(Client sender, string message)
    {
        MessageReceivedArgs e = new MessageReceivedArgs(sender,message);
        if (MessageReceived != null)
            MessageReceived(this, e);
    }

    public void MessageReceivedFromChat(Client sender,string message)
    {
        RaiseMessageReceivedEvent(sender,message);
    }

    public void Send(string message)
    {
        chat.SendMessage(this, message);
    }




}

public class MessageReceivedArgs : EventArgs
{
    public string Message { get; set; }
    public Client Sender { get; set; }
    public MessageReceivedArgs(Client sender,string message)
    {
        Message = message;
        Sender = sender;
    }
}


public class Chat
{
    private List<Client> clients;

    public Chat()
    {
        clients = new List<Client>();
    }

    public void AddClient(Client client)
    {
        client.chat = this;
        clients.Add(client);
    }

    public void RemoveClient(Client client)
    {
        client.chat = null;
        clients.Remove(client);
    }

    public void SendMessage(Client sender, string message)
    {
        foreach(Client client in clients){
            if (client != sender)
            {
                client.MessageReceivedFromChat(sender, message);
            }

        }
    }

}
这个
        Chat chat = new Chat();
        Client jacques = new Client("jacques");
        Client Pierre = new Client("Pierre");
        chat.AddClient(jacques);
        chat.AddClient(Pierre);

        ChatWindow cw = new ChatWindow(jacques);
        cw.Show();
        ChatWindow cw1 = new ChatWindow(Pierre);
        cw1.Show();