Как очистить и обновить панель в 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.