Элементы управления Sub Classed не обновляются в конструкторе - PullRequest
0 голосов
/ 16 декабря 2011

субклассифицированные элементы управления, которые уже существуют в winform, не обновляются при обновлении субклассифицированного элемента управления :( Эта проблема очевидна в конструкторе или при выполнении кода. Есть ли способ обойти эту проблему, так как обновление загружаетсяконтроля, взяв их и надев новые, кажется клочком?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

Из вопроса у меня изначально был запуск WinForms и у меня были похожие проблемы ...

Я решил с опцией READONLY

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

После того, как ЭТО сделано, каждый раз, когда вы изменяете свой элемент «Только для чтения» и повторно открываете форму, новые значения будут иметь приоритет над старыми, так как сериализация конструктора НЕ будет помещать эти значения в.

Как только вы получите те элементы, которые вы хотите стандартизировать / ограничить, вы несколько застряли (только немного). Даже если у вас может не быть свойства getter / setter для свойства, вы МОЖЕТЕ иметь открытый МЕТОД (который дизайнер не использует), но в коде вы МОЖЕТЕ изменить значение, например ...

public class MyTextBox : TextBox
{
   public MyTextBox() 
   {
      myBackColor = "Red";
   }

   private Color myBackColor

   [ReadOnly]
   public Color BackColor
   { get { return myBackColor; } }

   public void SetNewBackColor( Color anyNewColor )
   {
      myBackColor = anyNewColor;
   }
}

Наконец, для тех, кого вы «очистили» от явного содержимого в конструкторе формы, но не хотите оставлять элементы доступными только для чтения, вы также можете использовать атрибут для [SerializableAttribute] и многие другие вы можете найти здесь . Это явно не будет включать сериализованный атрибут, если вы явно не установите его в конструкторе.

Надеюсь, это даст вам что-то хорошее, чтобы пережевывать.

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication1
{
    // Default all textboxes as string value instead of null
    [DefaultValue("")]
    public class MyTextbox : TextBox
    {
        // designer serialization is another alternative to preveting the IDE to analyze controls
        // at design time, but for other tighter controls, leave explicitly as READONLY...
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [ReadOnly(true)]
        public override Font Font
        { get { return MyConstants.MyFontBase; } }

        [ReadOnly(true)]
        public override Color ForeColor
        { get { return Color.Red; } }

        [ReadOnly(true)]
        protected override Padding DefaultPadding
        { get { return MyConstants.MyPadding; } }

        // Now, on to the rest of the class definition and interaction if editing mode changed
        public MyTextbox()
        {
            base.Font = Font;
        }

    }

    /// <summary>
    /// constants used for common look / feel application wide for all controls
    /// such as textbox, label, buttons, comboboxes, etc...
    /// </summary>
    public class MyConstants
    {
        public static readonly Color MyColorBlue = Color.Blue;
        public static readonly Color MyFontForeColor = Color.Black;
        // public static readonly Color MyFontForeColorDisabled = Color.FromArgb(38, 146, 210);
        public static readonly Color MyFontForeColorDisabled = Color.Gray;
        public static readonly Color MyBackColorFieldRequired = Color.LightBlue;
        public static readonly Color MyBackColorFieldInvalid = Color.Red;
        public static readonly Color MyBackColorFieldNormal = Color.White;
        public static readonly String MyFontBaseName = "Arial";
        public static readonly float MyFontBaseSizeHdr = 16F;
        public static readonly float MyFontBaseSizeSubHdr = 11F;
        public static readonly float MyFontBaseSize = 14F;
        public static readonly Font MyFontBase = new Font(MyFontBaseName, MyFontBaseSize, FontStyle.Regular, GraphicsUnit.Point);
        public static readonly Font MyFontItalic = new Font(MyFontBaseName, MyFontBaseSize, FontStyle.Italic, GraphicsUnit.Point);
        public static readonly Size MyButtonSize = new Size(80, 25);
        public static readonly Padding MyPadding = new Padding(2, 0, 2, 0);
    }

}

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

0 голосов
/ 17 декабря 2011

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

...