Создайте форму, затем найдите ее позже, не показывая изначально - PullRequest
1 голос
/ 04 мая 2010

У меня проблема странная для меня, но, надеюсь, не такая странная для кого-то другого. :) Немного предыстории: я работаю над простым IM-клиентом, который позволяет пользователю рассылать сообщения нескольким получателям. Цель состоит в том, чтобы создать форму чата для каждого из получателей, содержащую текст широковещательного сообщения, а затем отображать эту форму только в том случае, если получатель отвечает на широковещательный запрос. Однако, когда приложение получает ответ, а затем пытается найти форму для этого конкретного сеанса чата (используя Application.OpenForms), оно не может найти его, ЕСЛИ МЕНЯ. .Show во время его создания. Я хотел бы избежать отображения этой формы при ее создании, поскольку это означает, что пользователь увидит вспышку на экране. Форма, кажется, на самом деле не создается, пока я ее не покажу, но, похоже, должен быть способ сделать это, не показав сначала. Кто-нибудь может помочь?

Я могу предоставить фрагменты кода, если это необходимо, я этого не делал в этом посте, потому что это больше похоже на концептуальное недоразумение с моей стороны, чем на ошибку в коде. Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

Вместо использования формы в качестве базового класса, сделайте это другим способом, создайте класс, который может ссылаться на форму. Таким образом, вы будете информировать класс о содержимом и отображать его в форме (если он инициализирован), а не наоборот. Вы не должны полагаться на формы как основу ваших объектов. Использование Application.OpenForms должно быть ненужным.

public class Contact
{
    string displayname = String.Empty;
    List<Message> history = new List<Message>();
    MessageForm theform = new MessageForm(this);

    public void OnEvent(Message msg)
    {
        if(msg.Sender != me && !theform.Visible)
            theform.Show();

    }

    public void Tell(string message)
    {
    }

}

и т.д.

Держите свои контакты в каком-то списке, и все должно быть относительно просто. (Имейте в виду, что формы Windows не являются поточно-ориентированными и выдают исключение, если вы попытаетесь изменить какие-либо свойства любого элемента управления из потока, отличного от основного)

0 голосов
/ 04 мая 2010

Почему бы не сохранить ссылку на форму в сеансе чата и использовать ее для вызова .Show(), когда вам нужно отобразить форму:

session.form.Show();

Вы можете создать форму, не показывая ее, и у вас не будет лишних затрат на вызов Application.OpenForms каждый раз, когда вы захотите сослаться на нее.

Я знаю, что это говорит об очевидном, но OpenForms не найдет форму, которая не была показана, потому что она не открыта.

0 голосов
/ 04 мая 2010

Поскольку дескриптор формы не создается до тех пор, пока форма не отобразится, вы можете назначить его вручную следующим образом:

mf = new MainForm();

        /* Need to assign a handle to MainForm instance manually
         as handle does not get created until form is shown */
        IntPtr handle = mf.Handle; 
0 голосов
/ 04 мая 2010

Форма окна имеет методы, такие как Hide (), Show () и Activate (). используйте этот метод для вашей проблемы.

...