在 wxPHP 中更新属性时如何刷新 wxAuiManager 窗格?
How to refresh wxAuiManager panes when updating their properties in wxPHP?
我设置了一个简单的 wxAuiManager
系统,其中包含八个文本控件,每个控件设置为一个窗格,所有控件都围绕一个中央静态控件排列。我有两个分别捕捉到顶部、左侧、右侧和底部窗格方向。这部分工作正常。
我现在想修改每个窗格的属性,我认为这可以通过重置关联的 wxAuiPaneInfo
来完成。例如,我想 add/remove 图钉或最大化图标。我可以让它自己工作,但是在重置这些属性后重新绘制托管 window 被证明是一个挑战。
这是我目前使用的代码:
// 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();
如您所见,我目前所做的是将窗格与管理器分离,重新添加,然后强制管理器重绘所有内容。这很好,除了它经常将 window 重新停靠在一个新位置。它也不会“感觉正确”- 修改这些属性必须独立于分离窗格来实现。
除此之外,我认为值得尝试隐藏和显示窗格,但无济于事:
// 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;
}
我现在需要做的就是捕获窗格移动事件,然后我可以将此数据用于 LoadPaneInfo()
。这被证明有些困难——wxPHP 似乎没有提供足够的 wxEVT
常量来允许这样做。我有 关于这个。
我会继续尝试一些新的东西。
我在完成之前放弃了这个任务。我记得,没有一种简单的方法来刷新窗格,虽然当前的维护者在该项目上做了一些出色的工作,但他们不再有时间处理它,因此它有点被遗弃了。这可能是由于难以追踪棘手的可靠性错误,或者是将编译的 PHP 扩展二进制文件放入主要 Linux 发行版的官方存储库中的挑战。
暂时用户认为这暂时“不可能”可能是明智的,因为我确实付出了很多努力试图解决它。当然,如果有人找到实现此目的的可靠方法 objective,请添加您自己的答案,我会 select 优先于此。
我设置了一个简单的 wxAuiManager
系统,其中包含八个文本控件,每个控件设置为一个窗格,所有控件都围绕一个中央静态控件排列。我有两个分别捕捉到顶部、左侧、右侧和底部窗格方向。这部分工作正常。
我现在想修改每个窗格的属性,我认为这可以通过重置关联的 wxAuiPaneInfo
来完成。例如,我想 add/remove 图钉或最大化图标。我可以让它自己工作,但是在重置这些属性后重新绘制托管 window 被证明是一个挑战。
这是我目前使用的代码:
// 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();
如您所见,我目前所做的是将窗格与管理器分离,重新添加,然后强制管理器重绘所有内容。这很好,除了它经常将 window 重新停靠在一个新位置。它也不会“感觉正确”- 修改这些属性必须独立于分离窗格来实现。
除此之外,我认为值得尝试隐藏和显示窗格,但无济于事:
// 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;
}
我现在需要做的就是捕获窗格移动事件,然后我可以将此数据用于 LoadPaneInfo()
。这被证明有些困难——wxPHP 似乎没有提供足够的 wxEVT
常量来允许这样做。我有
我会继续尝试一些新的东西。
我在完成之前放弃了这个任务。我记得,没有一种简单的方法来刷新窗格,虽然当前的维护者在该项目上做了一些出色的工作,但他们不再有时间处理它,因此它有点被遗弃了。这可能是由于难以追踪棘手的可靠性错误,或者是将编译的 PHP 扩展二进制文件放入主要 Linux 发行版的官方存储库中的挑战。
暂时用户认为这暂时“不可能”可能是明智的,因为我确实付出了很多努力试图解决它。当然,如果有人找到实现此目的的可靠方法 objective,请添加您自己的答案,我会 select 优先于此。