问题描述
||
我正在尝试格式化PopupMenu,并注意到当我使FieldSize-> 7时,菜单中的一项将换行,即使在我看来似乎有足够的空白可以使用在右边。
当我将FieldSize-> 8增大时,fieldSize现在就足够了,并且所有菜单项都不会环绕。
但是在我看来,现在已经浪费了空白空间。我尝试了PopupMenu的许多选项,例如ContentPadding等,以使项目更紧密,但是当我将fieldSize设置回7时,它坚持要包装该项目。
可能是字体样式问题?我想知道是否有人对此有窍门。
这是代码,并显示问题
Manipulate[
opt,Control[{ {opt,Style[\"display\",11]},{0->Text@Style[\"bob only\",Small],4->Text@Style[\"L + bob\",1->Text@Style[\"L only\",2->Text@Style[\"L resolved\",3->Text@Style[\"L + resolved\",5->Text@Style[\"L resolved + bob\",6->Text@Style[\"show all above\",Small]
},ControlType->PopupMenu,FieldSize->7,ImageMargins->0,FrameMargins->0,ContentPadding->True,ImageSize->Small}]
]
这是我打开菜单时的屏幕截图
所以,现在我更改FieldSize-> 8,现在看起来像这样:
但是请注意上面的内容,我认为右边的空白太多,并且FieldSize-> 7应该足够宽,以至于该项目不会被包裹起来?
我尝试了FontFamily-> \“ Times \”和\“ Courier \”,效果相同:
Manipulate[opt,Small,FontFamily->\"Courier\"],FontFamily->\"Courier\"]
},ImageSize->Small}]
]
实际上,现在使用Courier,我不得不去FieldSize-> 9来使该字段现在不环绕。因此,使用Courier变得更糟。
是否可以使领域变得比现在更紧密?
编辑1:
回复MrWizard:
编辑2:
使用FieldSize-> Automatic,使整个菜单大小根据所选项目而改变大小。
Manipulate[opt,Control[{{opt,{0->Style[\"bob only\",1->Style[\"L + bob\",2->Style[\"L only\",3->Style[\"L resolved\",4->Style[\"L + resolved\",5->Style[\"L resolved + bob\",6->Style[\"show allabove\",Small]},FieldSize->Automatic,ImageSize->Small}]]
更新12月21日凌晨1点
下图显示了如何使用Leonid宏方法使其变得更容易
通过使用来构建UI并减少用于UI对象定制的代码重复
宏。我目前大量使用此方法,并且具有超过
仅用于UI本身的4,000行,我不可能用旧的方式完成,
因为我只会失去对事物的控制。
宏使管理代码布局更容易,而且更重要的是,现在我
可以通过编辑小代码而不是
宏代表的较大代码。没有GUI构建器,宏
接下来是最好的东西:)
这是上面的代码
Manipulate[
Row[{opt1,opt2}],Evaluate@With[{
popUpMenu1Options = MenuStyle -> {Red},popUpMenu2Options = MenuStyle -> {Black},popUpMenuCommonoptions = {BaseStyle -> 20,ImageMargins -> 0,FrameMargins -> 0,ImageSize -> All}
},With[{
menu1 = PopupMenu[Dynamic[opt1],{\"A\",\"B\"
},Sequence[popUpMenu1Options,popUpMenuCommonoptions]
],menu2 = PopupMenu[Dynamic[opt2],{\"C\",\"D\"
},Sequence[popUpMenu2Options,popUpMenuCommonoptions]
]
},Row[{menu1,menu2}]
]
],{{opt1,\"A\"},None},{{opt2,\"D\"},TrackedSymbols :> {opt1,opt2}
]
解决方法
根据Simon的答案进行略微修改会更好:
Manipulate[opt,Control[{{opt,Style[\"display\",11]},{0 -> Style[\"bob only\",Small],1 -> Style[\"L only\",4 -> Style[\"L + bob\",2 -> Style[\"L resolved\",3 -> Style[\"L + resolved\",5 -> Style[\"L resolved + bob\",6 -> Style[\"show all above\",Small]},ControlType -> PopupMenu,ImageMargins -> 0,FrameMargins -> 0,ImageSize -> All}]]
, 我不得不删除所有的Text@
内容,因为这会导致系统上的行显示为空白。
这里似乎有两个问题。
您可以使用小数FieldSize
您必须考虑下拉箭头的宽度
您可以看到,我可以在最长的直线上得到相当紧密的配合:
Manipulate[opt,FieldSize -> 6.4,ImageSize -> Small}]]
通常,我认为Mathematica最好不要将文本压缩为箭头。我不知道一种实现这种效果的方法,如果那是您所追求的。
, 我猜一个愚蠢的解决办法是将所有字符串都填充到相同(最大)长度,然后使用FieldSize->Automatic
。
StringPad[str_String,n_Integer] := StringJoin[PadRight[Characters[str],n,\" \"]]
menuItems = {0->\"bob only\",1->\"L only\",2->\"L resolved\",3->\"L + resolved\",4->\"L + bob\",5->\"L resolved + bob\",6->\"show all above\"};
maxStr = Max@StringLength@menuItems[[All,2]]
(* Out[3]= 16*)
f[str_String] := StringPad[str,maxStr]
Manipulate[opt,MapAt[f,#,2]&/@menuItems,ControlType->PopupMenu,FieldSize->maxStr,ContentPadding->False,ImageMargins->0,FrameMargins->0,ImageSize->Small}]]
这可以用您自己的自定义PopupMenu
自动执行。
, 只是在寻找其他答案时碰到了这一点。在可能的情况下,我希望将样式与功能分开,因此,对于上述示例,我的偏好是仅列出一组样式选项,而不是对每个标签进行样式设置,例如
Manipulate[opt,Style[
Control[{{opt,\"display\"},{0 -> \"bob only\",1 -> \"L only\",4 -> \"L + bob\",2 -> \"L resolved\",3 -> \"L + resolved\",5 -> \"L resolved + bob\",6 -> \"show all above\"},ControlType -> PopupMenu}],DefaultOptions -> {PopupMenu -> {BaseStyle -> 10,ImageSize -> All,MenuStyle -> {Red,11}}}]]