我有一个继承自UserControl的基类,其上有一个面板。我制作了一个允许我显示/隐藏面板的属性。
public partial class BaseControl : UserControl
{
// ...
private Panel panTitle; // this is actually declared in the designer file..
public BaseControl()
{
InitializeComponent();
// hide the panel by default
IsTitlePanelVisible = false;
}
[DefaultValue(false)]
public bool IsTitlePanelVisible
{
get { return panTitle.Visible; }
set { panTitle.Visible = value; }
}
}
现在,如果我在设计器中打开从BaseControl继承的其他控件,则面板可见! 在我将属性窗口中的IsTitlePanelVisible属性更改为true并返回false后,它将消失。
我还在BaseControl的设计器中将面板本身的Visible属性设置为false,但它仍然显示出来。
在设计师中打开派生控件时,是否有人建议如何让面板不显示?
编辑:为了使事情更清楚,还有以下内容: 我已经有了大量的派生控件,我不想改变所有这些控件。 如果我打开一个派生控件并手动将值设置为false,一切正常,但我无法理解为什么它不起作用,因为在基本控件的构造函数中将值设置为false ..
答案 0 :(得分:2)
也许你需要调用基础构造函数
class DerivedControl : BaseControl
{
public DerivedControl()
: base()
{
}
}
class BaseControl : UserControl
{
public BaseControl ()
{
InitializeComponent(); // makes the panel visible by default
IsTitlePanelVisible = false // makes the panel hidden explicity
}
}
同样来自MSDN:
DefaultValueAttribute不会自动导致成员 使用属性的值初始化。您必须设置初始值 在你的代码中。
答案 1 :(得分:1)
我做了一个快速测试应用程序,看看我是否可以复制你的问题。我做的唯一不同的事情是在设计器中添加面板并将其可见性设置为false。它正确地做到了这一点。看起来您手动创建了panTitle Panel。在何时/何时将其添加到您的控件中,您最好的选择是添加Panel,如上所述。
修改强>
在仔细阅读您的问题时,看起来您不希望在查看DerivedUserControl的设计选项卡时显示Panel。我发布的内容不会改变,我不确定是否可以改变这种行为。当你将它放在Form上时它将不可见,但这样就像预期的那样。
这是一个快速工作的例子。
<强> Form1中强>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
DerivedUserControl dv = new DerivedUserControl();
public Form1()
{
InitializeComponent();
this.Controls.Add(dv);
}
private void button1_Click(object sender, EventArgs e)
{
if (dv.IsTitlePanelVisible)
dv.IsTitlePanelVisible = false;
else
dv.IsTitlePanelVisible = true;
}
}
}
基本用户控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class BaseControl : UserControl
{
public BaseControl()
{
InitializeComponent();
}
[DefaultValue(false)]
public bool IsTitlePanelVisible
{
get { return panTitle.Visible; }
set { panTitle.Visible = value; }
}
}
}
BaseControl.Designer.cs InitializeComponent
private void InitializeComponent()
{
this.panTitle = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// panTitle
//
this.panTitle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
this.panTitle.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.panTitle.Location = new System.Drawing.Point(0, 0);
this.panTitle.Name = "panTitle";
this.panTitle.Size = new System.Drawing.Size(150, 147);
this.panTitle.TabIndex = 0;
this.panTitle.Visible = false;
//
// BaseControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.panTitle);
this.Name = "BaseControl";
this.ResumeLayout(false);
}
派生UserControl
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class DerivedUserControl : BaseControl
{
public DerivedUserControl()
{
InitializeComponent();
}
}
}
答案 2 :(得分:0)
您是否尝试默认将panTitle.Visible
设置为false?
ComponentModel DefaultValue
属性仅用于设计器,以确定propertyGrid中的属性是否应显示为粗体(脏)以及是否应将其值生成为<{1}}方法< em> InitializeComponent
的派生类