2015-05-24 3 views
3

Следующий код представляет собой пример из MSDN:C# Создание чертежа объекта

private void Form1_Paint(object sender, 
    System.Windows.Forms.PaintEventArgs pe) 
{ 
    // Declares the Graphics object and sets it to the Graphics object 
    // supplied in the PaintEventArgs. 
    Graphics g = pe.Graphics; 
    // Insert code to paint the form here. 
} 

У меня есть несколько вопросов:

  • Можем ли мы изменить имя Form1_Paint метода? Я имею в виду, должен ли он иметь суффикс «Paint»? Когда метод .net вызывает этот метод? Как система знает, какой метод вызывать, чтобы он мог рисовать изображения?

  • Я не понимаю, почему мы просто указываем, что Form1_Paint метод может получить 2 аргумента, а затем волшебным образом рамки просто вызывает метод с ссылкой на object и ссылки на PaintEventArgs объекта (ре).

Я извиняюсь за глупые вопросы, но я из главным образом функционального программирования, и я путаюсь с использованием рамок, потому что кажется, что они призывают свои собственные методы. Может ли кто-нибудь объяснить это как 6-летнему?

+1

Вам необходимо изучить события, обработчики событий и делегаты. Метод переименовывается. Вы присоединяете метод в качестве обработчика события каким-то событием, и когда событие возбуждается, метод запускается, при этом отправитель является триггером событий (я думаю) и pe данными, связанными с событием. –

+0

[Этот вопрос] (http://stackoverflow.com/questions/7091781/c-sharp-event-handler-explanation-please), и статья во втором ответе Джона Скита имеет хорошую информацию. –

ответ

3

В соответствии с комментарием Form1_Paint является обработчиком событий для события Paint.

Аргументы не являются волшебными, они необходимы для этого события, то есть если вы хотите привязываться к этому событию, реализация метода обработчика ДОЛЖНА соответствовать требуемым аргументам событий. PaintEventHandler определяется как:

public delegate void PaintEventHandler(object sender, PaintEventArgs e); 

По умолчанию при добавлении обработчика в дизайнере (например, с помощью двойного щелчка на элементе управления пользовательского интерфейса или на иконку Events на вкладке «молнии»), обработчик событий автоматически создается с именем по умолчанию:

{name of the control}_{name of event} 

В вашем случае, если форма имела название Form1, когда был создан метод обработчика.

Вы можете переименовать метод обработки, но если вы так так, вам также необходимо изменить соответствующее событие связывания в Form1.designer.cs (т.е. изменение this.Form1_Paint в ниже):

this.Name = "Form1"; 
this.Text = "Form1"; 
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); 

(+= указывает подписка на событие - раз подписался, когда событие происходит, все методы, подписавшиеся будут вызываться)

Редактировать

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

this.Paint += (sender, pe) => 
{ 
    // Declares the Graphics object and sets it to the Graphics object 
    // supplied in the PaintEventArgs. 
    Graphics g = pe.Graphics; 
    // Insert code to paint the form here. 
}; 

Где sender и pe имеют одни и те же типы до. Дизайнер не будет делать это по умолчанию, поэтому вы можете программно добавить вышеуказанную подписку к своему конструктору Form1

+0

Иными словами, в файлах * designer.cs есть описание элементов управления, например. их свойства, привязанные обработчики событий к конкретным методам и т. д.? – CuriousGuy

+0

Да, файл 'designer.cs' отслеживает все элементы управления и их настройки, которые вы добавили во время разработки. Обычно вам не нужно открывать этот класс - он должен автоматически синхронизироваться с вашим дизайном визуальной формы. (Вы также можете изменить или переопределить элементы управления во время выполнения, но этот код должен войти в ваш 'Form.cs') – StuartLC

+0

Спасибо человеку. Это действительно очистило много вещей в моем сознании. – CuriousGuy

2

Winforms - это технология, основанная на событиях, то есть события происходят, и задача программиста - решить, что делать (если что-нибудь), когда это событие произойдет.Для достижения этой модели программирования на основе событий, используемой C#, происходит небольшое волшебство.

При создании новой формы в проекте Winforms создается файл .designer.cs, а также файл .cs. Файл .designer.cs является автоматически сгенерированным файлом. Он используется Visual Studio для создания дизайнерского представления, которое вы видите при разработке своей формы.

Когда вы добавляете элемент управления в свою форму, этот элемент управления создается программно в файле .designer.cs и задан некоторые значения по умолчанию (такие как размер, имя и идентификатор). Затем этот файл анализируется дизайнером Visual Studio, и дизайнер отображает дизайнерский вид на основе этого файла .designer.cs. Вы можете открыть файл .designer.cs и просмотреть все элементы управления в форме, которые программируются.

Теперь физические свойства элемента управления - это не единственное, что программируется в файле .designer.cs. Также создаются события. Когда вы создаете новое событие, такое как событие Paint, какая визуальная студия делает это в файле .designer.cs и прикрепляет обработчик события к событию этого элемента управления. Затем он создает заглушку метода в вашем файле .cs и прикрепляет этот метод к вашему событию в файле .designer.cs. Вы можете изменить имя на все, что хотите, до тех пор, пока вы не измените параметры метода. Имя вашего метода в вашем файле .CS должно совпадать с именем в вашем файле .designer.cs, поэтому вам нужно изменить имя в обоих местах.

Смежные вопросы