2010-01-14 76 views
1

我有以下问题:我有一个基本窗体停靠在面板底部和面板内的一些按钮。继承此基本表单的表单可以通过属性显示在子表单属性中的“ButtonCloseVisiblity”属性来修改基本表单按钮的可见性。问题是,有时当子窗体刷新时(例如,当我双击一个事件,删除代码中新创建的事件并返回给设计者)时,按钮的可见性再次设置为它们的默认状态。在C#中的窗体继承#

+2

你的英语很好。 – DOK 2010-01-14 13:07:17

回答

1

挖一个答案我来这一点,当我有获得/从控制直接设置属性如基本形式和使用性能:

public bool ControlVisibility 
{ 
    get{ return control.Visibility; } 
    set{ control.Visibility = value; } 
} 

当子窗体修改,这种修改没有被持久化为代码,并且可见性是由基本表单定义的,因此每次打开子表单或重建项目时,继承控件的可见性默认为基本表单值。为了解决这个问题,我们必须添加一个字段,并在属性更改其值:

private bool _controlVisibility; 

public bool ControlVisibility 
{ 
    get{ return _controlVisibility; } 
    set 
    { 
     _controlVisibility = value; 
     control.Visibility = value; 
    } 
} 

这样的属性在代码仍然存在。

0

我已经使用了继承形式,但没有使用它们的控件。

对不起,如果你已经试过这个。

尝试将调试消息放置在基类的各种事件中。可能会有一次触发,您可以在设计模式下重新应用您的设置。

2

这很可能归属于基本属性上缺少的属性。看看this MSDN page,特别是DesignerSerializationVisibilityAttribute

0

是的,它在Visual Studio中非常频繁地发生。将您的更改保存在子窗体构造函数中,或者在OnLoad()中执行。如果您不希望在设计模式下以子窗体显示更改,则还可以添加以下检查。

if(!DesignMode){ 
    .... 
    } 
0

不知道我是否完全理解,但它似乎医治,如果可见性属性被覆盖值?如果您在设计器文件中手动更改该值,则在下次刷新设计器文件时(例如,添加新控件时),该值将被覆盖。

尝试从属性选项卡设置值,而不是在设计器文件中手动写入。

+0

我更改了属性选项卡中的属性,但它始终被覆盖 – Argons 2010-01-14 13:59:28

0

对于VS中的WinForms/controls上的可视化元素的继承并不是那么好或不可靠 - 正如我发现我的成本!消失或重新排列的控制或覆盖的属性恐怕是规范。

当我研究这个问题时,MS的回应似乎是,它太难以正确实施,并且他们没有计划解决它!我认为它很多依赖于子控件中的代码生成而不是真正的继承。

顺便说一下,DesignMode可以直接在窗体上进行控件,但如果您有窗体控件或任何更深层次的控件,则不可靠。去年我在某个时候在这里发表了一篇关于此事的文章或答案。