【问题标题】:How to clear and refresh a panel in Wx?如何在 Wx 中清除和刷新面板?
【发布时间】:2013-01-14 06:24:00
【问题描述】:

我正在构建一个新闻阅读器应用程序,并且我有一个 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();
}

【问题讨论】:

    标签: perl wxwidgets wxperl


    【解决方案1】:

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

    【讨论】:

    • 我自己没有尝试过,但听起来它应该很好用。 +1
    • 这个效果很好,没有闪烁,但滚动问题仍然存在。如果我不调整大小(只有几个像素),滚动不会自行更新并且不起作用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2012-12-11
      • 1970-01-01
      • 2015-09-15
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多