c # - создать невидимый пользовательский элемент управления - PullRequest
2 голосов
/ 05 мая 2010

Мне нужно создать пользовательский элемент управления в C # .Net, который можно добавить в приложение, не видя его, как FolderBrowserDialog. Это новое окно, которым я буду часто пользоваться, поэтому я считаю, что это правильный путь. Окно откроется, вызвав метод showDialog, как известно из другого диалога.

Есть идеи? Спасибо и всего наилучшего,

Daniel

Ответы [ 7 ]

5 голосов
/ 05 мая 2010

Поскольку все эти «невидимые» элементы управления происходят из класса Component, вам следует начать с чтения статьи MSDN:

3 голосов
/ 05 мая 2010

A UserControl по определению не является Form; Я думаю, что вы действительно хотите это Component. Тем не менее, вы не могли бы просто создать новый класс Form, который обладает нужной вам функциональностью? Всякий раз, когда вы хотите отобразить его, создайте новый экземпляр и вызовите ShowDialog. Или, если вы хотите сохранить состояние, добавьте экземпляр в качестве члена класса в родительскую форму, вызывайте его метод Show всякий раз, когда вы хотите его отобразить, и добавьте обработчик события в его событие FormClosing, чтобы проверить:

if (e.CloseReason == CloseReason.UserClosing)

и, если да,

e.Cancel = true;
Hide();

(Эта последняя часть предназначена для предотвращения ошибок, если пользователь закрывает форму, а затем пытается снова отобразить ее после удаления.)

3 голосов
/ 05 мая 2010

просто установите Visible на false или это не то, что вы просите?

0 голосов
/ 25 июня 2019

Производный от Control, а не UserControl, и в наборе конструкторов Visible = false.

Также создайте обработчик событий в конструкторе.

VisibleChanged += new EventHandler(SetVisibleFalse);

Создание методапо имени SetVisibleFalse.

private void SetVisibleFalse(object sender, EventArgs e)
{
    if (Visible) Visible = false;
}
0 голосов
/ 06 мая 2010

Вы можете поместить этот элемент управления в панели. Установите высоту панели = 0 visible = false, если вы не хотите показывать элемент управления. И делайте наоборот, когда хотите это показать.

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

Этот мыслительный процесс "показать / скрыть" очень похож на пережиток боли и растерянности классического VB.Старые методы отображения и скрытия и т. Д. Приводили в замешательство и часто оставляли меня как разработчика в состоянии не знать, существует ли объект или он просто невидим.И проверка была тривиальной, только если вы использовали On Error Goto для предотвращения нулевой ссылки.Так что сразу я бы посоветовал не думать с точки зрения наглядности, если вы не делаете что-то с веб-страницей и не хотите сохранять пространство и состояние.

Сначала создайте форму Windows и добавьте ее в свой проект, предполагая, чтоэто тип проекта, который вы описываете.Украсьте форму соответствующими элементами управления и, если применимо, создайте свойства, чтобы обеспечить открытый доступ к значениям элемента управления.Также установите свойство DialogResult для кнопок, которые либо «ОК», либо «Отмена» формы.Дайте ему соответствующий стиль границы либо Fixed3D, либо FixedDialog.Возможно также установите свойство, для которого вы хотите, чтобы форма отображалась при запуске - родительский центр, центральный экран, Windows по умолчанию и т. Д. Обработчики событий для «OK» и «Отмена» должны вызывать this.Close ();чтобы закрыть окно.

С точки вызова в коде, вот некоторый гипотетический код, который поможет вам двигаться в правильном направлении.Напишите что-нибудь подобное в том месте, где вы хотите вызвать диалог.

int intResult = 0;<br /> string strResult = null;<br /></p> <p>MyDialogForm frm = new MyDialogForm();<br /> frm.Title = "Select an Item";<br /> frm.SomeProperty = 0;<br /> frm.SomeOtherProperty = true;<br /> if (frm.ShowDialog() == DialogResult.OK)<br /> {<br /> intResult = frm.Result;<br /> strResult = frm.StringResult;<br /> }<br /> else if (frm.ShowDialog() == DialogResult.Cancel)<br /> {<br /> // User clicked the cancel button. Nothing to do except maybe display a message.<br /> MessageBox.Show("Canceled Task");<br /> }<br /></p> <p>...</p> <p>// Somewhere further on down, but within scope, simply repeat <br /> // what you just did, but without having to reinstantiate the <br /> // form Window. But if you make it that far within the same <br /> // scope, this method might be too busy and may need to be <br /> // factored down.<br />

Короче говоря:

  • Scrap show / hide - егоне очень хорошая практика
  • Сохранение данных формы без использования невидимой формы для ее сохранения;это работа класса
  • Если пользовательскому интерфейсу требуется многократное переключение между окнами, проверьте свой дизайн на наличие других альтернатив для решения исходной проблемы.Может быть, вам нужен такой шаблон дизайна, как MVC, в зависимости от размера и сложности вашего приложения.

Звук хорош?

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

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

button.Visible = true;  // shows the button
button.Show(); // Shows the button
button.Visible = false; // hides the button
button.Hide(); // Hides the button

Хотя кнопка все еще может быть в форме / элементе управления, она не будет интерактивной для пользователя. Вы все еще можете осуществлять программное управление кнопкой, но по сути это не пользовательский элемент управления, пока он «скрыт». Если вы хотите, чтобы там была какая-то скрытая кнопка, которую пользователь может нажать, вам нужно будет сделать что-то другое, чтобы получить это, но вам не должно нравиться это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...