我有两个System.ComponentModel类,ComponentA和ComponentB:
public class ComponentA : Component
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ComponentB ComponentB { get; } = new ComponentB();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Timer TimerA { get; } = new Timer();
}
public class ComponentB : Component
{
//[Browsable(false)]
public event EventHandler ComponentBEvent;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Timer TimerB { get; } = new Timer();
}
[注意ComponentA类的属性如何为ComponentB类型,而ComponentB类的属性如何为Timer类型(System.Windows.Forms.Timer)。 ComponentA还具有类型为Timer的属性,尽管目前尚不相关。 ComponentB也有一个事件(ComponentBEvent),这一事实是我发现的事件的关键。
照原样,这些类将产生我想要的东西,这是通过使用属性窗口将事件处理程序分配给嵌套组件中的事件的能力。 “属性”窗口的“事件”选项卡的以下屏幕截图显示了如何为ComponentB中的TimerB属性的Tick事件分配事件处理程序。
上面ComponentB的源代码具有注释掉ComponentBEvent事件的Browsable属性。取消注释属性,如:
public class ComponentB : Component
{
[Browsable(false)]
public event EventHandler ComponentBEvent;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Timer TimerB { get; } = new Timer();
}
不幸的是,ComponentB完全从“属性”窗口的“事件”选项卡中消失,从而无法将事件处理程序分配给ComponentB的TimerB属性。
总而言之,我发现能够使用属性窗口中的属性选项卡将事件处理程序分配给具有第三层嵌套(TimerB)的组件,这对于包含组件(ComponentB )具有一个事件(示例中为ComponentBEvent)。这仅对于具有第三层嵌套(或更高级)的组件来说是一个问题。 ComponentA类没有任何事件,但是这并不排除一个将事件处理程序分配给其TimerA属性的事件,如第一个屏幕截图所示。我遇到的问题仅影响“属性”窗口的“事件”选项卡。 “属性”选项卡按预期显示所有组件的属性。
] >>
我的问题是,如何使用属性窗口的“属性”选项卡将事件处理程序分配给具有第三层嵌套的组件,而不会被迫在其包含的组件中发生事件?
我的测试是通过.NET Framework 4.7.2项目中的Windows Forms应用程序完成的。
我有两个System.ComponentModel类,ComponentA和ComponentB:公共类ComponentA:Component {[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ...
ComponentC
扩展您的示例,然后再使用其他事件doesn't help。如果您要自己设置PropertyGrid.SelectedObject
,那么我建议您还是实现CustomTypeDescription
(example),以便较早地设置使用自己的属性对其进行扩展的功能(这非常有用)。