在WinForms设计器中禁用属性设置

3
我正在项目中使用Yet Another TabControl - 它是一个自定义的、开源的TabControl,支持设计师。在解决了一些问题之后,我遇到了一个我不知道如何解决的问题。
当我运行我的应用程序时,YATabControl会选择我在设计器中选择的相同选项卡 - 这并不是我想要的(我宁愿从第一个选项卡开始),而且当应用程序运行时,我无法通过选项卡进行移动,因为它试图在每次更改选项卡时保存"SelectedIndex"属性。
它是在设计师的 ~onclick 上设置的:
RaiseComponentChanging( TypeDescriptor.GetProperties( Control )[ "SelectedIndex" ] );  
RaiseComponentChanged( TypeDescriptor.GetProperties( Control )[ "SelectedIndex" ], oi, i );(old index, index).

我在思考 - 是否有一种方法可以禁止设计师设置属性的运行时值?


不是一个解决方法,但是作为一种变通方法,你能不能在构造函数中改变所选索引? - Ryan Amies
你在构造函数中设置它的位置在哪里?确保你在InitializeComponents()之后设置它。那么在Load事件中呢? - Ryan Amies
听起来好像SelectedIndex的值正在被序列化。将控件拖放到一个窗体上并查看窗体的Designer.cs文件。确保SelectedIndex属性没有被设置。 - Hans Passant
@Ryan:当我在包含这些选项卡控件的窗体构造函数中设置所选索引时,它运行良好。它总是显示我需要的第一个选项卡。但是 - 每次我浏览选项卡时,它都会更改我的设计师和resx文件。 - mrówa
3个回答

5

我查看了源代码(没有下载),但是看起来你必须告诉 SelectedIndex 属性不要序列化自身:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public virtual int SelectedIndex {
  get {
    return yaSelectedIndex;
  }
  set {...}
}

这个答案唯一缺少的是:每次 RaiseComponentChanged/Changing 都会重写设计师文件,因此最好剪切那些仅编辑不适用属性(即未序列化的属性)的部分 - 这样您就不必担心在应用程序处于调试状态时选择不同的选项卡。 - mrówa

3

[Browseable(false)] 是最好的选择 :)


3
“[Browsable(false)]”:指定一个属性或事件是否应该在属性窗口中显示。 - Qwertie

0

你需要两个属性,就像这样:

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool MyExtraProperty { get; set; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接