none
回调创建新窗口 RRS feed

  • 问题

  • 正在开发一个聊天软件
    当服务器收到消息后  通过回调创建一个新form   但是这个form怎么都建不起来。。。不知道为啥?
    有大哥知道如何回调创建一个form窗口?


    淡叶到此一游
    2009年10月6日 6:30

答案

  • 应该使用Invoke

    例子

      public void UpdateClientsList()
      {
       if (this.InvokeRequired)
        this.Invoke(new MethodInvoker(PrivateUpdateClientsList),
         new object[] {});
       else
        this.PrivateUpdateClientsList();
      }
      private void PrivateUpdateClientsList()
      {
       this.memberListView.Items.Clear();
       foreach (string nick in this.clientsList)
       {
        ListViewItem item = new ListViewItem(nick);
        if (this.client.Name == nick)
        {
         item.ForeColor = Color.Red;
        }
        this.memberListView.Items.Add(item);
       }
            }
    2009年11月24日 1:41

全部回复

  • hi,
      你直接在客户端实现的回调方法里New一个form的实例,然后调用show方法。
    不可以吗?


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月6日 13:00
    版主
  • 你好,
    参考:

    If the callback object is running in a Windows Forms synchronization context, or if it needs to update some UI, you must marshal the callbacks or the updates to the UI thread. You can use techniques such as those in Example 8-6 or Example 8-8. However, the more common use for UI updates over callbacks is to have the form itself implement the callback contract and update the UI, as in Example 8-22.

    partial class MyForm : Form,IMyContractCallback
    {
       MyContractClient m_Proxy;

       public MyForm(  )
       {
          InitializeComponent(  );
          m_Proxy = new MyContractClient(new InstanceContext(this));
       }
       //Called as a result of a UI event
       public void OnCallService(object sender,EventArgs args)
       {
          m_Proxy.MyMethod(  ); //Affinity established here
       }
       //This method always runs on the UI thread
       public void OnCallback(  )
       {
          //No need for synchronization and marshaling
          Text = "Some Callback";
       }
       public void OnClose(object sender,EventArgs args)
       {
          m_Proxy.Close(  );
       }
    }

    摘自:       Programming WCF Services, 2nd Edition
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.
    2009年10月8日 2:36
    版主
  • 嗯,尝试了很多次,失败告终

    淡叶到此一游
    2009年10月8日 11:08
  • 我现在用wpf的ui进程实现了回调控件出现,并修改控件的属性
    winform下  如何访问ui进程?


    淡叶到此一游
    2009年10月16日 5:49
  • 是不是可以尝试对等通道来实现聊天程序?
     Windows Communication Foundation (WCF) 中的一种多方对等 (P2P) 通信技术。
    你可以google一下。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年11月20日 4:22
    版主
  • 应该使用Invoke

    例子

      public void UpdateClientsList()
      {
       if (this.InvokeRequired)
        this.Invoke(new MethodInvoker(PrivateUpdateClientsList),
         new object[] {});
       else
        this.PrivateUpdateClientsList();
      }
      private void PrivateUpdateClientsList()
      {
       this.memberListView.Items.Clear();
       foreach (string nick in this.clientsList)
       {
        ListViewItem item = new ListViewItem(nick);
        if (this.client.Name == nick)
        {
         item.ForeColor = Color.Red;
        }
        this.memberListView.Items.Add(item);
       }
            }
    2009年11月24日 1:41