我想在wxHaskell应用程序中动态添加和删除小部件。
我的问题是:
窗口可以调整大小,但是当手动变大时,单击“更多”按钮会显示它会快速闪回到最小尺寸。如果没有windowReLayout
调用,窗口根本不会改变大小。
windowRemoveChild
看起来像我想要的但是它不是从WXCore导出的,所以我猜这不是要在这一层使用(编辑:也是我没有在没有程序崩溃的情况下找到一种方法来使用它,因为它试图绘制到一个不存在的窗口,即使首先从布局中删除它然后从它的父项中删除它。但我找不到另类选择。 This answer建议只是隐藏窗口小部件,但在我的真实应用程序中,我使用的是复杂的自定义窗口小部件,我希望收集垃圾。
创建窗口小部件时已经定义了父/子关系,我可以再次为布局做这件事吗?例如,我是否可以为面板提供一个布局,将row 5
自动应用于其所有子项,而无需为每次更改重建布局? (如果我只是从布局中删除子项但不从父项中删除它们,它们只是位于原点,是否由一种默认布局控制?)
这是一个最小的示例,展示了我当前如何添加小部件,以及我是如何尝试删除小部件的。
module Main where
import Graphics.UI.WX
main :: IO ()
main = start $ do
count <- varCreate 100
items <- varCreate []
f <- frame []
cont <- panel f []
-- add a button
more <- button f
[ text := "more"
, on command := do
n <- varGet count
varSet count (n + 1)
new <- button cont
[ text := show n
, on command := print n ]
is <- varGet items
let is' = new : is
varSet items is'
set cont [ layout := row 5 (map widget is') ]
windowReLayout f
]
-- remove a button
less <- button f
[ text := "less"
, on command := do
is <- varGet items
case is of
i : is' -> do
-- windowRemoveChild f i -- crash
set i [ visible := False ] -- leak
set cont [ layout := row 5 (map widget is') ]
varSet items is'
return ()
_ -> return ()
]
set f [ layout := margin 5
$ column 5 [ row 5 [ widget more
, widget less ]
, widget cont ] ]