如何在wxPHP中更新其属性时刷新wxAuiManager窗格?

2022-08-30 12:30:02

我设置了一个简单的系统,其中包含八个文本控件,每个文本控件都设置为一个窗格,所有控件都围绕一个中央静态控件进行排列。我有两个分别贴靠顶部,左侧,右侧和底部窗格方向。这部分工作正常。wxAuiManager

我现在想修改每个窗格的属性,我认为这可以通过重置关联的.例如,我想添加/删除图钉或最大化图标。我可以让它自己工作,但是在重置这些属性后重绘托管窗口被证明是一个挑战。wxAuiPaneInfo

以下是我目前使用的代码:

    // Get the currently selected pane
    $paneIndex = $this->getSelectedPaneIndex();
    /* @var $paneInfo wxAuiPaneInfo */
    $paneInfo = $this->getPaneInfoByIndex($paneIndex);

    // Set new flag true/false on paneinfo, using setter methods
    /* @var $ctrl wxCheckBox */
    $ctrl = wxDynamicCast($event->GetEventObject(), "wxCheckBox");
    $methods = $this->getPaneSetterMethods();
    $method = $methods[$ctrl->GetName()];
    $paneInfo->$method($ctrl->GetValue());

    /* @var $window \wxTextCtrl */
    /* @var $manager \wxAuiManager */
    $window = $this->getManagedWindow()->getWindowByIndex($paneIndex);
    $manager = $this->getManagedWindow()->getAuiManager();

    // This sort of works, but the pane sometimes ends up being moved
    $manager->DetachPane($window);
    $manager->AddPane($window, $paneInfo);

    // Now redraw the panes
    $this->getManagedWindow()->getAuiManager()->Update();

如您所见,我目前所做的是将窗格与管理器分离,重新添加它,然后强制管理器重绘所有内容。这很好,除了它经常将窗口重新停靠在新位置。它也不“感觉正确” - 修改这些属性必须是可以独立于分离窗格来实现的。

相反,我认为值得尝试隐藏并显示窗格,但无济于事:

    // This does not work at all
    $paneInfo->Hide();
    $paneInfo->Show();

另外,我尝试过使用窗格加载器,尽管我不知道什么是“透视字符串” - 据我所知,它不是控件属性。

    // The string should be a "perspective string"
    $this->getManagedWindow()->getAuiManager()->LoadPaneInfo('auiPane0', $paneInfo);

因此,总而言之:我有一个有效的解决方案,但它并不理想,因为它重新停靠了有问题的窗格。我想我可以找出正确的命令来将其重新停靠在同一位置,但仍然感觉我应该能够以更简单的方式执行此操作。

有什么想法吗?


更新:我发现了如何使用透视捕获窗格信息,这可以通过以下方式完成:

$this->winSave = [];
for($i = 0; $i <= 7; $i++)
{
    $pi = $this->getPaneInfoByIndex($i);
    $persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($pi);
    echo $persp . "\n";
    $this->winSave[$i] = $persp;
}

我现在需要做的就是捕获窗格移动事件,然后可以将此数据与 .事实证明,这有点困难 - wxPHP似乎没有提供足够的常量来允许这样做。我对此提出了一个新问题LoadPaneInfo()wxEVT

我将继续尝试一些新事物。


答案 1

在完成任务之前,我放弃了这个任务。正如我所记得的,没有一种简单的方法来刷新窗格,虽然当前的维护者已经在项目上做了一些出色的工作,但他们不再有时间处理它,因此它已经变得有些废弃了。这可能是由于难以跟踪笨拙的可靠性错误,或者将编译的PHP扩展二进制文件放入主要Linux发行版的官方存储库中的挑战。

就目前而言,用户暂时认为这是“不可能”的可能是明智的,因为我确实付出了很多努力来尝试解决它。当然,如果有人找到实现这一目标的可靠方法,请添加您自己的答案,我会优先选择它。


答案 2

推荐