Необходимо обновить WinForm (отдельный процесс) для отображения вновь созданных пользовательских элементов управления - PullRequest
0 голосов
/ 03 июня 2011

Я столкнулся со странной проблемой, я запустил отдельный процесс на основе Win Form с помощью Process.Start из другого процесса.

Этот процесс только что отправил объект, который на самом деле содержит элементы управления .NET (например, кнопку, текстовое поле, метку, переключатель и т. Д.) В качестве информации (управляющей информации, которую я только что собрал из добавления других запущенных управляемых процессов). После отправки мне нужно нарисовать эти элементы управления в этом процессе, используя WinForm в качестве основного окна (в качестве процесса на основе формы).

НО ЭТИ ОРГАНЫ УПРАВЛЕНИЯ НЕ ОТНОСЯТСЯ К ОСНОВНОМУ ФОРМУ. Основная проблема связана с информацией родительского контроля, которая мне не подходит.

Взгляните на код

public partial class TestController: Form, IApplicationEventsSink
{
    static bool m_ControllerLoadedFirstTime = true;
    ITestControl m_TakoControlHandler = null;

    public Controller()
    {
        if (m_ControllerLoadedFirstTime == true)
        {
            MessageBox.Show("TAKOController called first time");
            InitializeComponent();
            m_ControllerLoadedFirstTime = false;
        }
        else
            MessageBox.Show("TAKOController called second time");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        MessageBox.Show("Form1_Load");

        initEnvironment();
        bool bSubscriptionCreated = createSubscription();

        if (bSubscriptionCreated == false)
            throw new Exception(String.Format("Controller failed to create subscription with Simulator process!!"));

    }
    public ITestControl CreateControl(CustomControl a_CustomControl)
    {
        ITestControl TakoControlHandler =                    Factory.CreateControl(a_CustomControl);

        m_TakoControlHandler = TakoControlHandler;

        return TakoControlHandler;
    }
    private void SetProperties(CustomControl a_CustomControl)
    {
        m_TakoControlHandler.setPropeties(a_CustomControl);
    }
    public void OnProcess(CustomControl a_CustomControl)
    {
        MessageBox.Show("OnProcess");
        ITestControl TakoHandler = CreateControl(a_CustomControl);

        if (TakoHandler != null)
        {
            SetProperties(a_CustomControl);
            m_TakoControlHandler.SetParentHandle(base.Handle);
        }

        base.Refresh();
        base.Update();            
        base.Show();
    }

}

while Контроль, который мне нужно визуализировать после его создания.

   public class TestButton : Button
   {
      Control m_Control;

      public TestButton()
      {
          m_Control = new Button();
      }
      public void SetParentHandle(IntPtr a_ControlHandle)
      {
         Control ParentControl = Control.FromHandle(a_ContainerHandle);
         this.m_Control.Parent = ParentControl;
      }

}

У какого-нибудь тела есть идея? Я был бы очень признателен. С уважением Усман

1 Ответ

1 голос
/ 03 июня 2011

Ваш элемент управления не будет отображаться в главном окне формы без добавления элемента управления в коллекцию элементов управления формы.

В вашей функции OnProcess вам нужно сделать что-то вроде этого:

this.Controls.Add(a_CustomControl);
...