У меня есть два 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 (a система. Windows .Forms.Timer). У ComponentA также есть свойство типа Timer, хотя это еще не имеет значения. У ComponentB также есть событие (ComponentBEvent), этот факт является ключом к тому, что я обнаружил.
Таким образом, эти классы будут производить то, что я ищу, - это возможность назначать обработчики событий для событий во вложенных компонентах. с помощью окна свойств. На следующем снимке экрана вкладки «События» окна «Свойства» показано, как можно назначить обработчик события для события Tick свойства TimerB в ComponentB.
![It is possible to assign event handlers to nested components by using the Properties Window](https://i.stack.imgur.com/cc3V9.png)
Исходный код для ComponentB выше, имеет закомментированный атрибут Browsable для события ComponentBEvent. Раскомментирование атрибута следующим образом:
public class ComponentB : Component
{
[Browsable(false)]
public event EventHandler ComponentBEvent;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Timer TimerB { get; } = new Timer();
}
приводит к нежелательному эффекту того, что ComponentB полностью исчезает на вкладке «События» окна «Свойства», делая невозможным назначение обработчика событий свойству TimerB компонента ComponentB.
![When the containing component does not include an event then it disappears from the Events tab in the Properties Window](https://i.stack.imgur.com/pzcCk.png)
Итак, подведем итог. Я обнаружил, что можно использовать вкладку «Свойства» в окне «Свойства» для назначения обработчика событий для компонента, который имеет третий уровень Вложение (TimerB) требуется, чтобы содержащий компонент (ComponentB) имел событие (ComponentBEvent в примере). Это проблема только для компонентов с 3-м уровнем вложенности (или больше, я полагаю). Класс ComponentA не имеет никаких событий, но это не препятствует назначению обработчиков событий его свойству TimerA, как показано на первом снимке экрана.
Проблема, с которой я столкнулся, затрагивает только вкладку «События» окна «Свойства». На вкладке «Свойства» отображаются свойства всех компонентов, как и ожидалось.
![The Properties tab of the Properties Window is unaffected](https://i.stack.imgur.com/Mfzsy.png)
У меня вопрос: как использовать вкладку «Свойства» в окне «Свойства» для назначения обработчиков событий для компонента с 3-й уровень вложенности и не быть вынужденным иметь событие в содержащем его компоненте?
Мои тесты были выполнены с помощью приложения Windows Forms в. NET Framework 4.7.2 проекте.