如何制作行为如此的GUI?

时间:2010-12-31 04:28:45

标签: winforms user-interface dynamic window constraints

如果没有插图,这很难解释,所以 - 一个插图,从几个hello-world示例的屏幕截图和大量的Paint工作拼凑而成:

GUI mockup

我已经开始在.NET上使用Windows Forms(通过IronPython,但这不应该很重要),并且还没有弄清楚。 GUI库通常非常令人生畏,因为每个类都有很多可能的属性。文档很好地解释了所有内容的作用,但不能很好地帮助您弄清楚您需要什么。

我将动态组装GUI,但我不认为这是困难的部分。我现在的关键点是:

  • 如何让文本标签自动调整为包含文本的宽度(这样文本不会剪辑,在调整窗口大小时我也不会为它们预留不必要的空间)?

  • 如何使垂直滚动条始终显示?设置VScroll属性(为什么当AutoScroll是公共的时候受到保护,BTW?)似乎没有做任何事情。

  • 当内容垂直布局时(通过Dock = DockStyle.Top),AutoScroll是如何添加水平滚动条的?我可以使用最小尺寸的面板来防止标签和相应的控件在窗口水平收缩时重叠,但是滚动条不会出现并且控件不可访问。

  • 如何在不调整窗口大小的情况下限制窗口大小调整(例如设置最小宽度)? (只需设置表格的最小/最大尺寸?)与此相关,有没有办法设置最小/最大宽度或高度而不设置最小/最大尺寸(即我可以只在一个维度上约束尺寸)?

  • 是否有适合十六进制编辑的内置控件,或者我自己需要构建一些内容?

......我应该使用其他东西(也许是更有能力的东西?)我听过WPF提到过,但我知道这涉及到XML,我真的想用XML构建一个GUI - 我已经有了数据一个对象图,做一些奇怪的XML伪序列化(在Python中,不能少!),以创建一个GUI似乎非常迂回。

2 个答案:

答案 0 :(得分:0)

如果您愿意使用Java / Swing,那么基本形式应该非常简单。我想说Netbeans IDE有一个非常好的WYSIWYG GUI编辑器。即使它是相当不错的,如果我说这就是它的全部内容,我会撒谎。你必须了解Swing以你想要的方式获得东西,否则你会砸到墙上。免费。您要求的大多数是GUI构建器的属性,在询问细节之前,您至少需要查看。

我对Visual Basic的经验很少,关于语言的一些事情使我更加困难,但是我没有看到更容易将一个简单的GUI与之结合起来。

答案 1 :(得分:0)

我最终使用了WPF。

从IronPython访问功能比我预期的更为复杂:

import clr
clr.AddReferenceByName("PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
clr.AddReferenceByName("PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
clr.AddReferenceByName("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
import System.Windows

(我不确定我是否可以/应该更改版本号。PublicKeyToken可能与安全目的的某种DLL签名有关;我不知道为什么WPF需要这个而WinForms没有。)

由于小部件的命名空间非常繁琐,并且我想导入很多名称,因此我设置了一些动态导入代码:

def Import(namespace, what):
    if isinstance(what, str):
        globals()[what] = getattr(namespace, what)
    else:
        for k, v in what.items():
            if k: namespace = getattr(namespace, k)
            for name in v:
                Import(namespace, name)

在找出布局工具的正确组合之后(这并不像本摘要那么容易听起来),一切似乎都“正常工作”,我很高兴。滚动行为是通过在主窗口中设置ScrollViewer并将HorizontalScrollBarVisibility设置为Auto来完成的。在ScrollViewer里面,我放了一个StackPanel来堆叠“字段框架”,每个字段都是Grid,有两列(我向{添加两个默认ColumnDefinition s {1}})。我在第0列中设置了“标签”,在第1列中设置了“值”小部件(组合框,按钮等),Grid.ColumnDefinitionsHorizontalAlignment

我还没有设置嵌套面板,但看起来应该不难。我已经玩过系统将事件连接到按钮。