Исходя из ответа верности, у вас есть один вариант:
Используйте следующий класс
public class SuspendAwareTreeView : TreeView
{
public readonly T RealControl;
private int suspendCount;
public bool IsSuspended
{
get { return suspendCount > 0; }
}
public Suspendable(T real) { this.RealControl = real; }
public void SuspendLayout()
{
this.suspendCount++;
this.RealControl.SuspendLayout();
}
public void ResumeLayout()
{
this.RealControl.ResumeLayout();
this.suspendCount--;
}
}
Затем используйте этот класс для всего, что нужно для его приостановки.
Очевидно, что это не сработает, если вы когда-нибудь передадите класс чему-то, что ожидает только элемент управления, или если что-то, находящееся вне вашего элемента управления, установит его.
Если это так, вы будете вынуждены пойти на множество не очень приятных решений:
- Напишите новый пользовательский элемент управления, который оборачивает TreeView и откладывает все вызовы к нему, но поддерживает приостановленное состояние.
- результирующий экземпляр больше не является "is-a TreeView", что вызовет проблемы.
- усилия по обслуживанию возможно высоки.
- Если по какой-то причине древовидная структура решила приостановить себя, это сломается.
- новая версия среды выполнения вряд ли что-то сломает, вы просто не получите новую функциональность без усилий.
- Реализация совершенно нового TreeViewEx, который предоставляет это состояние
- результирующий экземпляр больше не является "is-a TreeView", что вызовет проблемы.
- усилия по обслуживанию возможно высоки
- никогда не сломается, так как у вас есть полный контроль, но может отличаться от оригинала
- новая версия среды выполнения вряд ли что-то сломает, вы просто не получите новые функциональные возможности без значительных усилий (возможно, в нарушение закона / EULA).
- Нарушение инкапсуляции
- Никаких изменений для системы типов, все остальное продолжает работать.
- Потенциал технического обслуживания потенциально высок при изменении времени выполнения
- приложения будут ломаться, если среда выполнения изменится под ними
Для ваших нужд в том и только в том случае, если вы управляете версиями времени выполнения, это работает полностью (т. Е. В контролируемой корпоративной среде), следующее зло , но эффективный хак подходит До тех пор, пока вы проводите тестирование при каждом обновлении, оно может продолжать работать без особых усилий.
public class ControlInvader
{
private static readonly System.Reflection.FieldInfo layoutSuspendCount =
typeof(Control).GetField("layoutSuspendCount",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic);
private readonly Control control;
public bool IsSuspended
{
get
{
return 0 != (byte)layoutSuspendCount.GetValue(this.control);
}
}
public Suspendable(Control control) { this.control = control; }
}
Прикрепите это к TreeView, и тогда вы сможете проверить значение в любое время.
Повторюсь, это хрупко и совершенно не подходит для среды, в которой версия базовой среды выполнения строго не контролируется, и где вы можете предпринять возможные значительные усилия, чтобы исправить это при критических изменениях.
Было бы неплохо включить статический инициализатор, который проверяет, действительно ли поле существует, имеет ли он правильный тип, и прерывается, если нет.