0

我有一个继承自 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..

4

3 回答 3

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 不会导致成员使用属性值自动初始化。您必须在代码中设置初始值。

于 2012-07-20T15:18:44.617 回答
1

我做了一个快速测试应用程序,看看我是否可以复制你的问题。我唯一不同的是在设计器中添加面板并将其可见性设置为 false。它工作正常。看起来您正在手动创建 panTitle 面板。您在何处/何时将其添加到您的控件中,最好的选择是像我上面所说的那样添加面板。


编辑:

在仔细阅读您的问题时,您似乎不希望在查看 DerivedUserControl 的设计选项卡时显示面板。我发布的内容不会改变这一点,我不确定这种行为是否可以改变。但是,当您将其放在表单上时,它将不可见,并且以这种方式的行为与预期的一样。


这是一个快速工作的例子。

表格1

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 初始化组件

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);

}

派生用户控件

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();
        }
    }
}
于 2012-07-20T15:17:06.603 回答
0

您是否尝试过panTitle.Visible默认设置为 false ?

ComponentModelDefaultValue属性仅用于设计者确定 propertyGrid 中的属性是否应该显示为粗体(脏),以及它的值是否应该生成到派生类的InitializeComponent方法中BaseControl

于 2012-07-20T15:15:44.450 回答