如何在C#中创建树视图首选项对话框类型的接口?

时间:2020-03-05 18:38:05  来源:igfitidea点击:

我正在编写一个基本上只是一个首选项对话框的应用程序,就像Visual Studio本身使用的树视图首选项对话框一样。该应用程序的功能只是将数据从串行设备传递到文件。在将数据写入文件之前,它会对数据执行许多转换,因此应用程序的GUI只是指示这些转换应该是什么的所有设置。

设计/编码树视图首选项对话框的最佳方法是什么?我一直在处理的方法是在主窗口的左侧停靠一个树形控件。然后,我一直在创建与树的每个节点相对应的容器控件。选择一个节点后,该应用会将该节点的相应容器控件置于最前面,将其移至正确的位置,并在主窗口中将其最大化。在设计时,这似乎确实非常笨拙。基本上,这意味着在设计期间,我在主窗口的边缘之外有大量的容器控件,因此必须不断滚动主窗口才能使用它们。我不知道这是否完全符合我的写作方式,但也许我正在谈论的视觉效果更有意义:

基本上,我必须使用这种巨大的表单,并在各处使用容器控件,然后进行大量运行时重新格式化以使其全部正常工作。这似乎是很多额外的工作。我这样做是完全愚蠢的吗?是否有一些我缺少的"显而易见"的简便方法?

解决方案

回答

一种比较简单的方法是为每个"窗格"创建单独的表单,并在每个表单构造函数中设置

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

这样,每种形式都可以在其自己的设计器中进行布局,在运行时实例化一次或者多次,然后像正常控件一样添加到空白区域。

也许主窗体可以在一个面板中使用带有静态TreeView的SplitContainer,而在另一面板中使用空间添加这些窗体。添加它们后,可以使用"隐藏/显示"或者" BringToFront / SendToBack"方法进行翻转。

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();

回答

格雷格·霍尔曼(Greg Hurlman)写道:

Why not just show/hide the proper container when a node is selected in the grid? Have the containers all sized appropriately in the same spot, and hide all but the default, which would be preselected in the grid on load.

不幸的是,这就是我要避免的事情。我正在寻找一种在设计时处理接口的简便方法,并且需要最少的重新格式化代码以使其在运行时正常工作。

我喜欢Duncan的答案,因为这意味着每个节点的接口设计可以完全分开。这意味着我不会在捕捉准则和其他设计时间优势上有所重叠。

回答

我可能会基于继承CustomControl的基类创建几个面板类。这些控件将具有诸如"保存/加载"之类的方法。如果是这样,我可以分别设计每个面板。

我使用了一个向导控件,该控件在设计模式下处理了多个页面,因此可以单击设计器中的下一个并通过设计器一次设计所有页面。尽管在将代码连接到控件时有很多缺点,但这可能意味着我们可以通过构建一些设计器类来进行类似的设置。我从来没有自己在VS中编写过任何设计师类,所以我不能说怎么做或者是否值得:-)

我对我们打算如何处理将值加载到控件或者从控件保存值有点好奇?如果所有页面都采用一种大格式,则在一个类中必须有很多代码?

当然,还有另一种方法是使用有关设置类型的信息,在请求每个页面时生成gui代码。