Вы можете получить услугу IDesignerHost
во время разработки.Эта служба имеет свойство под названием Container
, которое имеет Components
.Затем для каждого компонента получите сервис INestedContainer
, а затем получите все компоненты этого сервиса.
Так работает окно Document Outline .Я изменил их метод, чтобы использовать List<IComponent>
в качестве возвращаемого значения:
List<IComponent> GetSelectableComponents(IDesignerHost host)
{
var components = host.Container.Components;
var list = new List<IComponent>();
foreach (IComponent c in components)
list.Add(c);
for (var i = 0; i < list.Count; ++i)
{
var component1 = list[i];
if (component1.Site != null)
{
var service = (INestedContainer)component1.Site.GetService(
typeof(INestedContainer));
if (service != null && service.Components.Count > 0)
{
foreach (IComponent component2 in service.Components)
{
if (!list.Contains(component2))
list.Add(component2);
}
}
}
}
return list;
}
Чтобы отфильтровать результат, содержащий только элементы управления, вы можете вызвать result.TypeOf<Control>()
.