应用程序设计,选项卡窗口和主窗口之间,问题总结。
1.子窗口和主窗口传递参数
1.1以子窗口作为参数构造子窗口
将主窗口作为参数传递给子窗口,则在不关闭子窗口的情况下,子窗口可以对主窗口中的public内容进行修改。但是由于只能对public内容进行更改,而主窗口内控件为private,无法在不关闭子窗口的条件下,更新主窗口外观。对此的解决方案在之后阐述。
1.2 注意!C#中的类是引用,变量赋值给变量会出现状况
在应用程序中,选项窗口(子窗口)的button希望实现如下功能:
“应用”:主窗口根据修改参数变化外观,但是选项窗口不关闭;之后点击“确认”保留更改,点击“取消”不保留更改。
“确认”:关闭选项窗口,并按修改参数变化主窗口外观。
“取消”:不对主窗口做任何改变。
对“应用”后“取消”的实现,需要在创建子窗口Option的时候,备份主窗口的参数设置,即需要有如下语句:
_options = new UserOption(_mainForm._options);
但是, 上述语句,如果写成:
_options =_mainForm._options;
在“应用”button的响应函数中更改主窗口属性_mainForm._options时,作为备份的_options(子窗口内部变量)也会随_mainForm._options改变。
因为,在C#中,有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。对于引用类型,两种变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。C#中的class关键字,即声明的引用类型。
由于引用关系的存在,_mainForm = form; 语句才能够是子窗口直接操作主窗口中的public成员,更改其中属性。
而作为备份的_options,要作为一个独立的变量而存在,其初始化,需要使用 new 关键字建立。
C#中,直接用“ = ”进行赋值,代表是同一个变量的引用;如需要用已知变量构造新的变量,则需要使用“new”来对新变量进行初始化。
1.3使用“事件”实现“应用”button的功能
1.3.1 在子窗口中声明委托和事件
public delegate void OptionChangeHandlder(object sender, System.EventArgs e); //定义委托
public event OptionChangeHandlder OptionChange;//委托的事件
private void apply_Click(object sender, EventArgs e)
{
_mainForm._options.BackColor = colorNow.BackColor;
_mainForm._options.TextFont = new Font(_fontStyle.FotFaml, _fontStyle.FotSize);
//窗口设置的更改
if (this.OptionChange != null)
{
this.OptionChange(this, new EventArgs());
}//引发事件
}
1.3.2 在主窗口中进行事件响应函数
在主窗口显示子窗口的事件中,将事件添加到队列中:
private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
{
Option optionCard = new Option(this);
optionCard.OptionChange += new Option.OptionChangeHandlder(optionCard_OptionChange);
optionCard.ShowDialog();
optionCard.Dispose();
}
定义事件响应函数
<pre name="code" class="csharp"> void optionCard_OptionChange(object sender, EventArgs e)
{
//throw new NotImplementedException(); vs10生成语句,暂时没懂
OptionApply();
}
2.主窗口 richTextBox 中文本格式设置
2.1 选项窗口中,向字体列表添加所有系统字体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
p的目的:标志当前字体对应在list中的编号。
2.2 新文本格式定义
C#中,文本格式对应的类型是Font(包括字体、字号等),而且不能修改已经存在的文本类型。也就是说,对于一个已知的字体 font ,其属性值是只读的,不能更改。所以,在修改主窗口中文字的格式时,需要使用 Font 的构造函数创建新变量,再用新变量赋值给主窗口对应属性。
示例语句如下:
_mainForm._options.TextFont = new Font(_fontStyle.FotFaml, _fontStyle.FotSize);
3. 主窗口背景颜色设置
和文本格式相同,颜色对应类型 Color ,其已存在的变量也不能修改属性,只能重新构造,然后才能使用。