Запретить Designer от удаления атрибутов на элементах управления - PullRequest
0 голосов
/ 23 января 2012

Я хочу пометить определенные элементы управления в моей форме 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, чтобы я мог применить там атрибут?Как я уже писал выше, в некоторых случаях он возвращается обратно.

Спасибо!richn

Ответы [ 3 ]

1 голос
/ 17 апреля 2012

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

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

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

  1. Щелкните правой кнопкой мыши на наборе инструментов
  2. Нажмите «Выбрать элементы»
  3. Подождите. Не делайте ошибку, заканчивая визуальную студию сейчас.
  4. Выберите Обзор.
  5. Выберите файл DLL.
0 голосов
/ 24 января 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.

0 голосов
/ 23 января 2012

Мне обычно не нравятся люди, которые дают ответ "не делай этого", но не делай этого.

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

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

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

...