我有以下问题:我有一个基本窗体停靠在面板底部和面板内的一些按钮。继承此基本表单的表单可以通过属性显示在子表单属性中的“ButtonCloseVisiblity”属性来修改基本表单按钮的可见性。问题是,有时当子窗体刷新时(例如,当我双击一个事件,删除代码中新创建的事件并返回给设计者)时,按钮的可见性再次设置为它们的默认状态。在C#中的窗体继承#
回答
挖一个答案我来这一点,当我有获得/从控制直接设置属性如基本形式和使用性能:
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;
}
}
这样的属性在代码仍然存在。
我已经使用了继承形式,但没有使用它们的控件。
对不起,如果你已经试过这个。
尝试将调试消息放置在基类的各种事件中。可能会有一次触发,您可以在设计模式下重新应用您的设置。
这很可能归属于基本属性上缺少的属性。看看this MSDN page,特别是DesignerSerializationVisibilityAttribute
。
是的,它在Visual Studio中非常频繁地发生。将您的更改保存在子窗体构造函数中,或者在OnLoad()中执行。如果您不希望在设计模式下以子窗体显示更改,则还可以添加以下检查。
if(!DesignMode){
....
}
不知道我是否完全理解,但它似乎医治,如果可见性属性被覆盖值?如果您在设计器文件中手动更改该值,则在下次刷新设计器文件时(例如,添加新控件时),该值将被覆盖。
尝试从属性选项卡设置值,而不是在设计器文件中手动写入。
我更改了属性选项卡中的属性,但它始终被覆盖 – Argons 2010-01-14 13:59:28
对于VS中的WinForms/controls上的可视化元素的继承并不是那么好或不可靠 - 正如我发现我的成本!消失或重新排列的控制或覆盖的属性恐怕是规范。
当我研究这个问题时,MS的回应似乎是,它太难以正确实施,并且他们没有计划解决它!我认为它很多依赖于子控件中的代码生成而不是真正的继承。
顺便说一下,DesignMode可以直接在窗体上进行控件,但如果您有窗体控件或任何更深层次的控件,则不可靠。去年我在某个时候在这里发表了一篇关于此事的文章或答案。
你的英语很好。 – DOK 2010-01-14 13:07:17