Я создал класс, который наследует древовидное представление (CustomTreeview), это будет класс, в котором я работаю на протяжении всего вопроса. Мне нужен какой-то способ, чтобы не дать CustomTreeview рисовать саму себя и узлы, пока все свертывание или развертывание не будет завершено. Я называю это обновлением экрана, так как я знаком с этим в VBA. Я попытался переопределить метод OnPaint, а также метод OnNodeDraw. Хотя ни метод node.toggle, ни методы CollapseAll / ExpandAll не вызывают ни один из методов OnPaint / OnNodeDraw. Ниже приведено то, что я пробовал для обоих методов OnPaint / OnNodeDraw (имена и входные данные, очевидно, немного отличались для удовлетворения переопределения).
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
if (!collapsing && !expanding)
{
base.OnDrawNode(e);
NotifyNodeDrawn(this, e);
}
}
NotifyNodeDrawn запускает обработчик событий, на который я подписываюсь в другом классе. проверьте некоторые логи c, решая, находится ли он в режиме развертывания или свертывания (логические значения, которые я устанавливаю, записывая через методы CollapseAll / ExpandAll).
public new void CollapseAll()
{
collapsing = true;
base.CollapseAll();
collapsing = false;
this.Invalidate();
}
public new void ExpandAll()
{
expanding = true;
base.ExpandAll();
expanding = false;
this.Invalidate();
}
Если это будет работать так, как я хотел, затем, когда я вызываю ExpandAll (), например, узлы не будут перерисовываться, пока не будет вызван CustomTreeview.Invalidate (). Хотя, как я уже говорил перед вызовом ExpandAll / CollapseAll, метод OnDrawNode / OnPaint вообще не вводится.
Заранее благодарю за помощь!