如何在 Wx 中清除和刷新面板



我正在构建一个新闻阅读器应用程序,我有一个wxScrolledWindow,我可以在其中显示新闻。但是,我有类别,单击一个类别时,我想使用当前分类的新闻更新此面板。我在wxScrolledWindow上使用DeleteChildren实现了这一目标,但这似乎不能正常工作。

问题是新闻正在重新生成时会闪烁,而且滚动条也不会出现,除非我划过整个窗口。此外,有时除非我做这个手册调整大小,否则新闻不会显示。我尝试刷新,但它仍然是一样的。这是我的代码:

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();
}

DestroyChildren()之前调用$self->Freeze()以在执行更新之前停止重绘,然后在完成后调用Thaw(),在Refresh()之后。它应该快得多,并且不会有任何闪烁。

使用两个面板,一个向用户显示,一个用于准备新显示。 新显示完成后,显示新面板并隐藏旧面板。 互生。

相关内容

  • 没有找到相关文章