Запретить конструктору удалять атрибуты элементов управления

Я хочу пометить определенные элементы управления в моей форме Windows с помощью атрибутов. Поэтому я добавил атрибут в свой TestAttributes.Designer.cs:

[AmbientValue(true)]
private System.Windows.Forms.Label label1;

Но всякий раз, когда я изменяю Modifiers-свойство label1, используя окно свойств дизайнера, дизайнер молча удаляет мой атрибут из объявления:

public System.Windows.Forms.Label label1;

Я попытался поместить объявление в TestAttributes.cs, чтобы не связываться с файлом .Designer.cs. Но при изменении свойства Modifiers объявление возвращается к TestAttributes.Designer.cs, а атрибут исчезает.

Как я могу запретить Дизайнеру удалять мои Атрибуты?

РЕДАКТИРОВАТЬ: лучше задать вопрос: могу ли я навсегда переместить объявление элемента управления из файла *.Designer.cs, чтобы я мог применить там атрибут? Как я писал выше, в некоторых случаях он возвращается обратно.

Спасибо! богатый


person richn    schedule 23.01.2012    source источник
comment
С этим возникает ряд проблем. Во-первых, вы не должны изменять файл *.Designer.cs, потому что он автоматически регенерируется дизайнером. Вот почему он скрыт по умолчанию. Во-вторых, не имеет смысла устанавливать значение окружения элемента управления Label на true. Как элемент управления Label может быть true? При необходимости наследуйте элементы управления и добавляйте необходимые свойства по умолчанию, а затем используйте этот настраиваемый элемент управления в дизайнере.   -  person Cody Gray    schedule 23.01.2012
comment
Да, я знаю, что изменение файла .Designer.cs — это плохо, но я подумал, что, возможно, есть способ получить оттуда объявление метки. Но я думаю, что то, что я пробовал, так же плохо ;-). Label и AmbientValue - это только примеры в тестовом приложении, в моем реальном приложении это настраиваемый атрибут.   -  person richn    schedule 23.01.2012
comment
Вы всегда можете переместить элементы из файла *.Designer.cs в свои собственные файлы кода. Тогда дизайнер не будет их изменять. Это то же самое, что вы делаете, когда хотите добавить код в метод Dispose по умолчанию. Если вы знаете, что это плохо/не работает, все равно непонятно, зачем вы это делаете.   -  person Cody Gray    schedule 23.01.2012
comment
Я попытался переместить объявление из *.Designer.cs в свой собственный файл кода. Но он возвращается к *.Designer.cs, и мой атрибут теряется, когда я изменяю свойство Modifiers.   -  person richn    schedule 23.01.2012


Ответы (3)


Если вы хотите сохранить поддержку дизайнера, я рекомендую использовать внешнюю библиотеку классов.

    namespace ClassLibrary1
    {
        [System.ComponentModel.AmbientValue(true)]
        public class TestClass : System.Windows.Forms.Label
        {
        }
    }

Вы можете скомпилировать что-то подобное в библиотеку классов, а затем импортировать в Visual Studio. Если вы не знаете, как это сделать, следуйте инструкциям ниже.

  1. Щелкните правой кнопкой мыши панель инструментов
  2. Нажмите «Выбрать товары»
  3. Ждать. Не совершайте ошибку, закрывая Visual Studio сейчас.
  4. Выберите Обзор.
  5. Выберите файл DLL.
person Jack    schedule 16.04.2012

Обычно мне не нравятся люди, которые дают ответ «не делай этого», но не делают этого.

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

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

Если вам кажется, что это требует много работы, вы всегда можете попробовать использовать конструктор в качестве модели, а затем скопировать ее в новый проект, не относящийся к Windows Forms.

person Sam I am says Reinstate Monica    schedule 23.01.2012

До недавнего времени я был убежден, что дизайнер — это просто часть кода, и его нельзя трогать. Я ошибался. Оказывается, вы можете вырвать все это, и тогда компилятор выдаст вам ошибку. Хорошо, просто определите свои собственные вещи, полностью исключив необходимость в дизайнере. вот как. Скажи, что у тебя есть тег

<div id="div1" runat="server">

и вы хотите сделать его невидимым с обратной стороны без какого-либо файла Designer.cs (мы его удалили). Сначала укажите его вместе с другими объявлениями (т.е. вне page_load, где-то снаружи)

protected System.Web.UI.HtmlControls.HtmlGenericControl div1;

Помните, однако, что вы ДОЛЖНЫ ссылаться на ВСЕ, что вы используете на лицевой стороне, которая имеет тег runat="server". Итак, скажем, у вас есть страница только с меткой runat="server", сзади мы ссылаемся на нее как

namespace yournamespace.something
{
    public class yourpagetitle: System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Image imgLogo;
        protected System.Web.UI.WebControls.TextBox tbDate;
        protected System.Web.UI.WebControls.Label yourLabelName;

Обратите внимание, что я добавил изображение и текстовое поле в качестве дополнительных примеров. И ура! Таким образом, вы полностью устранили необходимость в файле Designer.cs. О, и обратите внимание, файл Designer.cs — это не что иное, как то, что мы только что сделали выше, но он делает это за вас автоматически. ...большую часть времени... Когда что-то не получается, время действовать по-своему. Я уверен, что если вы переформатируете свой компьютер, переустановите все и т. д., все снова заработает, без сомнения. Это просто законный обходной путь для тех, у кого нет времени нянчиться и устранять неполадки, которые делает Microsoft.

person Lukas    schedule 24.01.2012
comment
Да, вы можете не использовать файл *.designer.cs, если вы не используете конструктор. Собственно, для этого и нужен этот файл. Это частный файл, автоматически сгенерированный дизайнером, реализованный с использованием разделяемых классов, чтобы скрыть его от пользователя в целях удобства. Если вы не используете конструктор, вам не нужно использовать файл конструктора. Но если вы измените файл дизайнера, он будет перезаписываться всякий раз, когда вы снова будете работать в дизайнере. Здесь ничего не сломано в системе. - person Cody Gray; 24.01.2012