Работа с формами
Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом, взаимодействовать с пользователем.
При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы — ту часть, которую мы видим после запуска приложения и куда мы переносим элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим основные свойства форм.
Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:
Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в файле Program.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp < static class Program < [STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); >> >
Сначала программой запускается данный класс, затем с помощью выражения Application.Run(new Form1()) он запускает форму Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий класс формы.
Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1.Designer.cs, который выглядит примерно так:
namespace HelloApp < partial class Form1 < ////// Required designer variable. /// private System.ComponentModel.IContainer components = null; ////// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) < if (disposing && (components != null)) < components.Dispose(); >base.Dispose(disposing); > #region Windows Form Designer generated code ////// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() < this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Name = "Form1"; this.Text = "Привет мир!"; this.ResumeLayout(false); >#endregion > >
Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose() , который выполняет роль деструктора объекта, и InitializeComponent() , который устанавливает начальные значения свойств формы.
При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.
Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции — установка свойств объектов, установка переменных.
Еще один файл — Form1.resx — хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для нескольких языковых культур.
И более важный файл — Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); >> >
По умолчанию здесь есть только конструктор формы, в котором просто вызывается метод InitializeComponent() , объявленный в файле дизайнера Form1.Designer.cs. Именно с этим файлом мы и будем больше работать.
Скрывать и отображать форму, созданную в Windows forms C#
У меня есть готовая программа, которая содержит одну форму. Форма отображается поверх всех окон widows, но иногда ее необходимо скрывать, работать с другими программами, затем снова восстанавливать. Я хочу реализовать скрытие с помощью нажатия клавиш. Что-то вроде этого:
if (e.KeyCode == Keys.Q) this.Hide();
Далее при повторном нажатии на эту клавишу окно должно появляться. Проблема в том, что при вызове метода this.Show() форма не появляется. Та же ситуация с this.WindowState = FormWindowState.Normal — форма не разворачивается из панели задач после присваивания FormWindowState.Minimized. Единственное, что удалось придумать — уменьшать и увеличивать размер формы при нажатии на клавишу. Окей, это сработало, но тут возникла еще одна проблема: при нажатии на «нерабочую» область форма перестает реагировать на нажатие клавиши. Это певедение естейственно и я догадываюсь почему это происходит, но задача остается нерешенной. Вопрос 1: как возвращать форму из скрытого состояния, используя Hide()/ FormWindowState.Minimized? Вопрос 2: есть ли более легкий способ реализации скрытия и отображения формы с учетом взаимодейсвия с нерабочей областью?
Отслеживать
68.2k 225 225 золотых знаков 80 80 серебряных знаков 223 223 бронзовых знака
Form. Closing Событие
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Происходит при закрытии формы.
public: event System::ComponentModel::CancelEventHandler ^ Closing;
public event System.ComponentModel.CancelEventHandler Closing;
[System.ComponentModel.Browsable(false)] public event System.ComponentModel.CancelEventHandler Closing;
[System.ComponentModel.Browsable(false)] public event System.ComponentModel.CancelEventHandler? Closing;
member this.Closing : System.ComponentModel.CancelEventHandler
[] member this.Closing : System.ComponentModel.CancelEventHandler
Public Custom Event Closing As CancelEventHandler
Тип события
Примеры
В следующем примере используется Closing для проверки того, изменился ли текст в TextBox . Если это так, пользователю будет предложено сохранить изменения в файле.
private: void Form1_Closing( Object^ /*sender*/, System::ComponentModel::CancelEventArgs^ e ) < // Determine if text has changed in the textbox by comparing to original text. if ( textBox1->Text != strMyOriginalText ) < // Display a MsgBox asking the user to save changes or abort. if ( MessageBox::Show( "Do you want to save changes to your text?", "My Application", MessageBoxButtons::YesNo ) == ::DialogResult::Yes ) < // Cancel the Closing event from closing the form. e->Cancel = true; // Call method to save file. > > >
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) < // Determine if text has changed in the textbox by comparing to original text. if (textBox1.Text != strMyOriginalText) < // Display a MsgBox asking the user to save changes or abort. if(MessageBox.Show("Do you want to save changes to your text?", "My Application", MessageBoxButtons.YesNo) == DialogResult.Yes) < // Cancel the Closing event from closing the form. e.Cancel = true; // Call method to save file. >> >
Private Sub Form1_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing ' Determine if text has changed in the textbox by comparing to original text. If textBox1.Text <> strMyOriginalText Then ' Display a MsgBox asking the user to save changes or abort. If MessageBox.Show("Do you want to save changes to your text?", "My Application", MessageBoxButtons.YesNo) = DialogResult.Yes Then ' Cancel the Closing event from closing the form. e.Cancel = True End If ' Call method to save file. End If End Sub End Class
Комментарии
Событие Closing устарело, начиная с платформа .NET Framework 2.0; вместо него используйте FormClosing событие .
Событие Closing возникает при закрытии формы. При закрытии формы освобождаются все ресурсы, созданные в объекте , и форма удаляется. Если отменить это событие, форма остается открытой. Чтобы отменить закрытие формы, присвойте свойству Cancel переданного CancelEventArgs обработчику событий значение true .
Если форма отображается как модальное диалоговое окно, нажатие кнопки Закрыть (кнопка с X в правом верхнем углу формы) приводит к скрытию формы, а DialogResult свойству присваивается значение DialogResult.Cancel . Вы можете переопределить значение, присвоенное свойству DialogResult , когда пользователь нажимает кнопку Закрыть , задав DialogResult свойство в обработчике событий для Closing события формы.
При вызове Close метода в окне, отображаемом Form как немодированное, нельзя вызвать Show метод , чтобы сделать форму видимой, так как ресурсы формы уже освобождены. Чтобы скрыть форму, а затем сделать ее видимой Control.Hide , используйте метод .
События Form.Closed и Form.Closing не вызываются при вызове Application.Exit метода для выхода из приложения. Если у вас есть код проверки в любом из этих событий, которые необходимо выполнить, следует вызвать Form.Close метод для каждой открытой формы по отдельности перед вызовом Exit метода .
Если форма является родительской формой MDI, Closing события всех дочерних форм MDI вызываются перед событием родительской Closing формы MDI. Кроме того, Closed события всех дочерних форм MDI вызываются перед событием Closed родительской формы MDI. Отмена Closing события дочерней формы MDI не препятствует возникновению Closing события родительской формы MDI. Однако при отмене события будет задано true Cancel свойство CancelEventArgs объекта , передаваемое в качестве параметра в родительскую форму. Чтобы принудительно закрыть все родительские и дочерние формы MDI, присвойте свойству Cancel значение false в родительской форме MDI.
Дополнительные сведения об обработке событий см. в разделе Обработка и вызов событий.
Применяется к
См. также раздел
- IsMdiContainer
- OnClosing(CancelEventArgs)
Как правильно скрыть форму?
Есть прога, парсит страницы,но больно уж глючит пока все спарсит, решил выйти из положения скрыть ее и открывать другую форму с заголовком подождите на 10-20 секунд с таймером.
1 2 3 4 5 6 7 8
private void button1_Click(object sender, EventArgs e) { Hide(); Form2 form2=new Form2(); form2.Show(); /*и тут дальше комманды,но проблема в том что когда форма скрывается то команды не выполняются , думаю не важно их писать".*/
Дальше открывается вторая форма и через определенное время она выключается и открывается опять первая форма, но ничего так и не сделав. Есть ли другой метод?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Скрыть форму при ее запуске
Здравствуйте! Подскажите, пожалуйста, как скрыть форму при загрузке. Прописал this.Hide() в.
Закрыть/скрыть форму в приложении NotifyIcon
Есть приложение notifyicon, это wf приложение которое находится в трее. Ну я думаю вы поняли. Так.
Как скрыть форму и оставить ее только в процессах?
Здравствуйте, я пишу некую прогу.Вообщем я хочу чтобы при запуске и её работе программа.
как правильно вставить png форму
я в общем создал дизайн программы для своей курсовой программы. и возникла такая ошибочка, когда.
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
Попробуй так:
1 2 3 4 5 6
private void button1_Click(object sender, EventArgs e) { this.Visible = false; Form2 fr = new Form2(); fr.Show(); }
Форму скрывает точно и открывает вторую.
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
а если надо просто показать новую форму, которая не создана, но весьма проста — окошко с текстом и кнопочкой ОК, которая закрывает окошко..
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
Если надо просто показать форму то так. Показать не созданную форму нельзя, сначала надо добавить вторую форму в проект, разместить на ней элементы, описать логику действия кнопки которая на ней, а потом показывать её из главной формы.
1 2 3 4 5
private void button1_Click(object sender, EventArgs e) { Form2 fr = new Form2(); fr.Show(); }