Как очистить и обновить панель в Wx?

Я создаю приложение для чтения новостей, и у меня есть окно wxScrolledWindow, в котором я показываю новости. Тем не менее, у меня есть категории, и когда на них нажимают, я хочу обновить эту панель новостями текущей категории. Я добился этого, используя DeleteChildren на wxScrolledWindow, но, похоже, это работает не очень корректно.

Проблема в том, что при обновлении новостей мигает, а также полосы прокрутки не появляются, пока я не растяну все окно. Кроме того, иногда, если я не делаю это руководство, изменение размера новостей не показывается. Я попробовал с обновлением, но это все то же самое. Вот мой код:

our ($self);

sub new {
    my ($class, $parent_window) = @_;
    $self = $class->SUPER::new($parent_window, -1);
    $self->SetScrollRate(10, 10);

    my @news = (...);
    regenerate_news_list(@news);

    return $self;
}

sub regenerate_news_list($) {
    my (@news) = @_;

    $self->DestroyChildren();

    my $vbox = Wx::BoxSizer->new(wxVERTICAL);
    for my $news_item (@news) {

        my $news_panel = Wx::Panel->new($self, wxID_ANY);

        my $news_sizer = Wx::BoxSizer->new(wxVERTICAL);
        my $news_title = Wx::HyperlinkCtrl->new($news_panel, wxID_ANY, $news_item{'title'}, $news_item{'url'},  wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
        my $news_description = Wx::StaticText->new($news_panel, wxID_ANY, $news_item{'description'}, wxDefaultPosition);
        $news_description->Wrap(560);

        $news_sizer->AddSpacer(5);
        $news_sizer->Add($news_title, 0);
        $news_sizer->AddSpacer(5);
        $news_sizer->Add($news_description, 0);
        $news_sizer->AddSpacer(5);

        $vbox->Add($news_panel, 0, wxEXPAND|wxALL);
    }

    $self->SetSizer($vbox);
    $vbox->Fit($self);
    $self->Refresh();
}

2 ответа

Вызов $self->Freeze() до DestroyChildren() чтобы остановить перерисовку, прежде чем делать обновления, затем позвоните Thaw() когда вы закончите, после Refresh(), Это должно быть намного быстрее и не будет никакого мерцания.

Используйте две панели: одну, которую вы показываете пользователю, другую, где вы готовите новый дисплей. Когда новый дисплей будет завершен, покажите новую панель и скройте старую. Alternate.

Другие вопросы по тегам