使用 XRC 在 wxWidgets 中隐藏一个 sizer 及其所有内容

Hiding a sizer and all its contents in wxWidgets using XRC

我正在使用 .xrc 文件来设置我的 wxWidgets GUI。 For most GUI elements I can specify <hidden>1</hidden> 并且元素不会被绘制。

我想要的是能够隐藏我的 wxStaticBoxSizer 并且不绘制它及其内容。

设置如下,但是加上<hidden>1</hidden>没有任何效果。静态框仍然按照它包含的所有内容进行绘制。

<object class="wxStaticBoxSizer" name="wxID_ANY">
    <orient>wxVERTICAL</orient>
    <label>Flight Formation</label>
    <object class="sizeritem">
    <flag>wxGROW|wxALL</flag>
    <border>10</border>
    <option>1</option>

是否可以从 .xrc 文件中隐藏此 wxStaticBoxSizer

目前无法在 XRC 中隐藏 sizer,最好的办法是从代码中调用 wxSizer::ShowItems()。将来支持 sizer 的 "hidden" 属性也可能是有意义的,尽管它可能应该被称为其他东西以避免造成 sizer 是 windows 的错误印象(它们不是).

顺便说一句,如果您尝试 validate 您的 XRC,您会发现此处不允许使用 "hidden" 元素。

快速破解:将 sizer 嵌套在 wxPanel 中并隐藏面板。


如果您愿意重建 XRC 库,这里有一个可以提供您需要的功能的快速补丁。

src/xrc/xh_sizer.cpp 中,在 wxSizerXmlHandler::Handle_sizer() 的正文中,在对 CreateChildren(parent, true/*only this handler*/); 的调用之后添加以下内容:

// This has to be done after CreateChildren().
if(GetBool(wxT("hideitems"), 0) == 1)
   sizer->ShowItems(false);

就是这样。重建库,现在您可以在 sizer 上指定 <hideitems>1</hideitems>,这意味着它将在创建时隐藏所有项目。

这将处理除 wxStdDialogButtonSizer 之外的所有 sizer,它有单独的代码。我使用 XRC 示例测试了 wxBoxSizerwxStaticBoxSizer。我想我会发送一个拉取请求以将此功能添加到 wx;与此同时,如果有人可以使用更大的应用程序对此进行更多测试,那就太好了。