Sub Classed控件未在设计器中更新

时间:2011-12-16 17:00:33

标签: c# winforms custom-controls

更新子类控件时,不会更新已存在于winform上的

子类控件:( 无论是在设计器中还是在运行代码时,这个问题都很明显。 有没有解决这个问题的方法,因为更新大量控件并将其置于新的控件上似乎是一个障碍?

感谢。

2 个答案:

答案 0 :(得分:0)

如果您关闭设计器中的表单并重新打开它,它应该适当更新。如果我不得不猜测,我会认为VS正在缓存控件外观以节省处理时间。

答案 1 :(得分:0)

从一个问题我最初开始使用WinForms并遇到类似的问题......

I resolved with the READONLY option

第一个警告......一旦你设置了一个给定的属性...字体大小,名称,背面颜色,前面的颜色等,只读和编译你的应用程序,每个控件都有这些控件,每个控件都会试着设置一个只读属性的错误。您所要做的就是完成所有错误并删除与这些只读属性关联的行。但是,如果您的应用程序距离不太远,则不应该花太长时间。

一旦完成,每次更改“只读”元素并重新打开表单时,新值将优先于旧值,因为设计器的序列化不会将这些值放入。

一旦你得到那些你想要标准化/限制的元素,你就会陷入困境(只是有点)。即使您可能没有属性的属性getter / setter,您仍然可以使用公共METHOD(设计人员不使用),但在代码中,您可以更改值,例如...

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]和许多其他you can find here。除非您在设计器中明确设置它,否则不会显式包含序列化属性。

希望这能为你提供一些好的东西。

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”是一个静态类,所以对象不必实例化,但是如果你应用这个概念对于你的基类,他们可以有所有类似的视觉冲击,功能,颜色等。