当FieldSize不够时,如何使PopupMenu中的项目更紧密(更少的空白区域)

时间:2011-06-14 06:08:22

标签: wolfram-mathematica

我正在尝试格式化PopupMenu,并注意到当我创建FieldSize-> 7时,菜单中的一个项目将换行换行,即使在我看来有足够的白色空间它可能已经习惯了。

当我增加FieldSize-> 8时,现在fieldSize已经足够了,并且所有菜单项都不会被包围。

但在我看来,现在浪费了大量的白色空间。我为PopupMenu尝试了很多选项,比如ContentPadding,这样可以使项目更紧凑,但是当我将fieldSize设置回7时,它坚持要包装那一项。

可能是字体样式问题?我想知道是否有人可以解决这个问题。

这是代码,并显示问题

Manipulate[
opt,

Control[{ {opt,0,Style["display",11]},
  {0->Text@Style["bob only",Small],
  4->Text@Style["L + bob",Small],
  1->Text@Style["L only",Small],
  2->Text@Style["L resolved",Small],
  3->Text@Style["L + resolved",Small],
  5->Text@Style["L resolved + bob",Small],
  6->Text@Style["show all above",Small]        
},
ControlType->PopupMenu,FieldSize->7,
ImageMargins->0,
FrameMargins->0,ContentPadding->True,ImageSize->Small}]

]

这是我打开菜单时的屏幕截图

enter image description here

所以,现在我改变了FieldSize-> 8,现在它看起来像这样:

enter image description here

但是请注意,我认为右边有太多的空白区域,而FieldSize-> 7应该足够宽,以至于该项目没有缠绕?

我尝试过FontFamily->“Times”和“Courier”,效果相同:

Manipulate[opt,
Control[{ {opt,0,Style["display",11]},
{0->Text@Style["bob only",Small,FontFamily->"Courier"],
4->Text@Style["L + bob",Small,FontFamily->"Courier"],
1->Text@Style["L only",Small,FontFamily->"Courier"],
2->Text@Style["L resolved",Small,FontFamily->"Courier"],
3->Text@Style["L + resolved",Small,FontFamily->"Courier"],
5->Text@Style["L resolved + bob",Small,FontFamily->"Courier"],
6->Text@Style["show all above",Small,FontFamily->"Courier"]
},ControlType->PopupMenu,FieldSize->7,
ImageMargins->0,FrameMargins->0,ContentPadding->True,ImageSize->Small}]
]

实际上现在有了Courier,我不得不去FieldSize-> 9,因为那个字段现在还没有环绕。所以Courier的表现最差。

是否有可能使场地比现在更紧张?

编辑1: 回复MrWizard: enter image description here enter image description here

编辑2:

使用FieldSize->自动,导致整体菜单大小根据所选项目更改大小。

Manipulate[opt,Control[{{opt,0,Style["display",11]},
{0->Style["bob only",Small],
1->Style["L + bob",Small],
2->Style["L only",Small],
3->Style["L resolved",Small],
4->Style["L + resolved",Small],
5->Style["L resolved + bob",Small],
6->Style["show allabove",Small]},
ControlType->PopupMenu,FieldSize->Automatic,
ImageMargins->0,FrameMargins->0,ImageSize->Small}]]

更新12月21日凌晨1点

下图显示了如何使用Leonid宏方法使其更容易 通过使用来构建UI并减少用于UI对象定制的代码重复 的宏。我目前大量使用这种方法,并且具有复杂的UI 只有UI本身就有4,000行,我不能用旧方法做到这一点, 因为我会失去对事物的控制。

宏使管理代码布局变得更容易,更重要的是,现在我 可以通过编辑小代码而不是更容易地更改UI本身 宏表示的较大代码。没有GUI构建器,宏 是下一个最好的事情:))

enter image description here

以下是

的代码
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"}, None},
 TrackedSymbols :> {opt1, opt2}
 ]

4 个答案:

答案 0 :(得分:6)

根据Simon的回答稍作修改可以更好地做到:

Manipulate[opt, 
 Control[{{opt, 0, Style["display", 11]}, 
   {0 -> Style["bob only", Small],
    1 -> Style["L only", Small],  
    4 -> Style["L + bob", Small],
    2 -> Style["L resolved", Small], 
    3 -> Style["L + resolved", Small], 
    5 -> Style["L resolved + bob", Small], 
    6 -> Style["show all above", Small]}, 
 ControlType -> PopupMenu, 
 ImageMargins -> 0, 
 FrameMargins -> 0, 
 ImageSize -> All}]]

enter image description here

答案 1 :(得分:1)

我必须删除所有Text@内容,因为它会导致我的系统上的行显示为空白。

这里似乎有两个问题。

  • 您可以使用小数FieldSize
  • 您必须考虑下拉箭头的宽度

你可以看到我可以在最长的线上得到一个相当紧密的合适:

Manipulate[opt, 
 Control[{{opt, 0, 
    Style["display", 11]}, {0 -> Style["bob only", Small], 
    4 -> Style["L + bob", Small], 1 -> Style["L only", Small], 
    2 -> Style["L resolved", Small], 
    3 -> Style["L + resolved", Small], 
    5 -> Style["L resolved + bob", Small], 
    6 -> Style["show all above", Small]}, ControlType -> PopupMenu, 
   FieldSize -> 6.4, ImageMargins -> 0, FrameMargins -> 0, 
   ImageSize -> Small}]]

enter image description here

一般来说,我认为 Mathematica 不会将文本压缩成箭头。我不知道如何实现这种效果,如果这就是你所追求的目标。

答案 2 :(得分:1)

我想一个愚蠢的修复方法是将所有字符串填充到相同(最大)长度,然后使用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,Control[{{opt,0,Style["display",11]},
           MapAt[f,#,2]&/@menuItems,
           ControlType->PopupMenu, FieldSize->maxStr,
           ContentPadding->False, ImageMargins->0,
           FrameMargins->0, ImageSize->Small}]]

这可以在您自己的自定义PopupMenu中自动生成。

答案 3 :(得分:1)

在寻找其他东西的答案时遇到了这个问题。在可能的情况下,我喜欢将样式与功能区分开来,所以对于上面那些例子我喜欢的只是列出一组样式选项,而不是为每个标签设置样式,例如。

Manipulate[opt,
 Style[
  Control[{{opt, 0, "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, ImageMargins -> 0,
       FrameMargins -> 0, ImageSize -> All, MenuStyle -> {Red, 11}}}]]