我创建了一个自定义Tabs Control。它可用作选项卡本身的彩色标签,也可用作保存内容的Panel。我的应用程序从配置文件中读取UI参数。以控制配置为例,以此行为例:
RTFBOX=(ID - rtf1) (BOUNDS - 0,0,100,100) (MULTILINE - enable) (FILE - email_rules.rtf)
这一行告诉应用程序创建我的自定义RichTextBoxPlus类的实例,重要的是它设置为从FILE参数读取富文本。如果我不将此RichTextBoxPlus添加到另一个Control,它会显示它的富文本格式绝对正常。
我有另一个在运行时读取操作的配置,这可以是简单的事情,比如告诉使用控件配置创建的按钮,当它被点击时,它应该使用来自TextBox控件的内容触发电子邮件。我有一个动作,将控件配对选项卡自定义控件中的每个选项卡。例如:
ADDTOTABS=(OBJECT - tabsControl1) (CONTROLS - panel1, panel2)
找到tabsControl1
并将panel1
添加到第一个标签页,将panel2
添加到第二个标签页。在此示例中,Panel正被添加到每个选项卡而不是单独的控件,因为Panel可以包含多个控件,在运行时通过ADDTOPANEL操作进行处理。
ADDTOPANEL=(OBJECT - rtf1) (TARGET - panel1) (TRIGGER - onload)
因此rtf1
的{{1}}实例已添加到RichTextBoxPlus
,然后将其添加到panel1
控件的第一个标签的相应Panel
。
我发现rtf1显示富文本格式,如果添加到panel1但没有将panel1添加到Tabs,则显示格式正常。
ADDTOTABS操作执行此方法:
Tabs
Tabs类的SetTaggedObject方法找到与提供的选项卡名称对应的Panel控件:
private void TabContents_Action(Tabs tabpanel, string[] ctrls)
{
string[] tabs = tabpanel.GetTabNames();
for(int i = 0; i < tabs.Length; i++)
{
Control control = this.Controls.Find(ctrls[i], true).FirstOrDefault();
tabpanel.SetTaggedObject(control, tabs[i]);
}
tabpanel.SetTabActive(tabs[0]);
}
这种方法似乎没什么不妥。
Tabs类的SetTabActive方法有更大的批量。这会处理更改所有选项卡的外观,以使非活动选项卡看起来与活动选项卡不同。它还隐藏并显示每个选项卡的面板,具体取决于选项卡是否处于活动状态。
public void SetTaggedObject(Control ctrl, string tab)
{
Control container = this.Controls.Find(tab, false).FirstOrDefault();
container.Controls.Add(ctrl);
}
不确定,但我会说问题必须在这个方法中。有什么想法吗?