C# Отключить обновление экрана при свертывании или развертывании всех триодов в виде дерева - PullRequest
0 голосов
/ 19 марта 2020

Я создал класс, который наследует древовидное представление (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 вообще не вводится.

Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 19 марта 2020

Хорошо, я пытался выяснить это в течение нескольких дней, и, наконец, я нашел решение проблемы после того, как я опубликовал вопрос. BeginUpdate () останавливает перерисовку элемента управления до тех пор, пока вы не вызовете EndUpdate (). Простое и эффективное решение! Я оставлю это здесь, чтобы помочь кому-то еще! Это все еще не входит в переопределение OnDrawNode / OnPaint, если у кого-то есть какие-либо решения этой тайны.

public new void ExpandAll()
{
    BeginUpdate();
    expanding = true;
    base.ExpandAll();
    expanding = false;
    EndUpdate();
}
...