属性窗口不显示第三级嵌套组件的事件,除非第二级嵌套组件具有事件

问题描述 投票:3回答:1

我有两个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 ...

c# .net winforms windows-forms-designer system.componentmodel
1个回答
0
投票
对我来说似乎是个虫子。我尝试进一步使用ComponentC扩展您的示例,然后再使用其他事件doesn't help

如果您要自己设置PropertyGrid.SelectedObject,那么我建议您还是实现CustomTypeDescriptionexample),以便较早地设置使用自己的属性对其进行扩展的功能(这非常有用)。

© www.soinside.com 2019 - 2024. All rights reserved.