2014-02-17 8 views
1

Когда я пишу приложение winforms, я стараюсь создать файл Implement.cs для каждой формы.Частичный класс имеет несколько форм

Скажем, у меня есть Form1.cs, я бы создать новый файл с именем Form1.Implementation.cs начиная с partial class Form1.

Form1.cs только содержит все методы обратного вызова событий (то, что дизайнер сделал), все остальное идет в Form1.Implementation.cs. Это помогает мне написать более читаемый код.


Я хотел Form1.Implementation.cs быть "субфайловом" так же, как Form1.Designer.cs, поэтому я отредактировал .csproj файл.

<Compile Include="Form1.Implementation.cs"> 
    <DependentUpon>Form1.cs</DependentUpon> 
</Compile> 

После перезагрузки, однако, Visual Studio автоматически добавляет <SubType>Form</SubType> сразу после DependentUpon элемента. Doubleclicking Form1.Implementation.cs не показывает код, а дизайнер с другой начальной пустой формой.

Это как

"класса Form1, которые ISA Form, это (?) Несколько форм."

Я попытался adding DesignerCategory attribute к классу Form1, но она влияет на Form1.cs, а также.

Ну, удар «Shift-F7» или «Ctrl-Shift-0» не имеет большого значения. Интересно, если ...

  1. это глюк Visual Studio,
  2. вторичный (?) Форма действительно существует как-то,
  3. он собирается взорвать мой WinForms проект когда-нибудь
+1

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

+1

Атрибут предназначен для 'Form1' _type_, а не для одного из его _source files_. Фактически, частичные классы существуют только в коде и объединены во время компиляции. –

ответ

2

Единственный способ добиться того, что вы пробовали, добавив <DependentUpon>, который вы уже знаете. Теперь Visual Studio автоматически добавляет <SubType>Form</SubType> для любого класса, производного от Form. Так как ваш Form1.cs, вероятно, содержит строку public partial class Form1 : Form, откуда и берется SubType.

Другие файлы - Form1.Designer.cs и Form1.Implementation.cs может содержать только partial class Form1, но так как частичные определения классов через несколько файлов по-прежнему эффективно одно определение класса, Visual Studio обнаруживает, что она по-прежнему наследует Form. Я думаю, вы уже знаете это, но на всякий случай here's the MSDN article about the partial keyword.Не беспокойтесь о том, что в этом сценарии есть несколько экземпляров Form. Помните, что это всего лишь один класс - Form1, не пропустите, сколько файлов вы его распространяете.

В конце концов, все файлы, содержащие код классов (даже частичные!) наследуя Form (или UserControl) автоматически открывается в конструкторе. Это по дизайну.

Решение здесь простое: либо создайте файл кода, определяющий отдельный класс, не основанный на Form, либо просто используйте F7 для просмотра кода этого файла в обозревателе решений, каким бы раздражающим это ни казалось. Неважно, был ли этот файл кода <DependentUpon> чем-либо или нет. Применяется только наследование Form или UserControl.

Лучшее решение, хотя, на мой взгляд, будет придерживаться того, что Visual Studio дает вам:

  • Дизайнер-сгенерированный код остается в Form1.Designer.cs
  • Ваш код (что вы положили в реализации), идет в Form1.cs(нажмите F7, чтобы просмотреть этот код вместо того, чтобы идти к дизайнеру)

Это подход, который моя команда придерживается уже несколько лет. Он обеспечивает базовое средство разделения кода конструктора и действий с ручным кодированием. Чтобы лучше отделить свой код, используйте шаблон дизайна, такой как MVP, как предложил Саймон Уайтхед в комментариях.

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