Инстанцируйте формы, затем найдите его позже, не показывая его первоначально

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

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

1
задан awilson53 29 April 2012 в 20:33
поделиться

4 ответа

Вместо использования формы в качестве базового класса сделайте это другим способом, создав класс, который может ссылаться на форму. Таким образом вы будете информировать класс о содержимом и отражать его в форме (если она инициализирована), а не наоборот. Вы не должны полагаться на формы как на основу ваших объектов. . В использовании 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 не являются потокобезопасными и вызовут исключение, если вы попытаетесь изменить любые свойства любого из элементов управления из потока, отличного от основного)

2
ответ дан 3 September 2019 в 00:49
поделиться

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

session.form.Show();

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

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

0
ответ дан 3 September 2019 в 00:49
поделиться

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

0
ответ дан 3 September 2019 в 00:49
поделиться

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

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
ответ дан 3 September 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: