子窗口和父窗口之间的数据交换问题

本文探讨了C#应用程序设计中,子窗口和主窗口之间的参数传递机制,重点介绍了如何在不关闭子窗口的情况下修改主窗口外观,并通过事件处理实现实用功能。此外,文章还详细解释了如何在主窗口中显示子窗口,以及如何通过事件响应函数来控制子窗口的行为,特别关注了文本样式和背景颜色的设置。最后,文章还讨论了文本样式和背景颜色设置的相关细节,展示了如何通过创建新的Font对象来实现文本样式的灵活定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用程序设计,选项卡窗口和主窗口之间,问题总结。


1.子窗口和主窗口传递参数

1.1以子窗口作为参数构造子窗口

  
public partial class Option : Form
{
private Form1 _mainForm = null;
private UserOption _options;
public Option(Form1 form)
{
InitializeComponent();
_mainForm = form;
_options = new UserOption(_mainForm._options);
}
}
  将主窗口作为参数传递给子窗口,则在不关闭子窗口的情况下,子窗口可以对主窗口中的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
      
public partial class Option : Form
{
private FontFamily[] _fofml = FontFamily.Families;
private int FontLoad() //加载函数
{
int num = 0;
int p = 0;
cboFont.Items.Clear();
foreach (FontFamily oneFontFamily in _fofml)
{
cboFont.Items.Add(oneFontFamily.Name);
if (_options.TextFont.FontFamily.Name == oneFontFamily.Name)
p = num;
num++;
}
return p;
}
}
   FontFamily定义了一组字样,其中,FontFamily.Families包含所有字样,不可更改。

    p的目的:标志当前字体对应在list中的编号。


2.2 新文本格式定义

  C#中,文本格式对应的类型是Font(包括字体、字号等),而且不能修改已经存在的文本类型。也就是说,对于一个已知的字体 font ,其属性值是只读的,不能更改。所以,在修改主窗口中文字的格式时,需要使用 Font 的构造函数创建新变量,再用新变量赋值给主窗口对应属性。

示例语句如下:


_mainForm._options.TextFont = new Font(_fontStyle.FotFaml, _fontStyle.FotSize);



3. 主窗口背景颜色设置

  和文本格式相同,颜色对应类型 Color ,其已存在的变量也不能修改属性,只能重新构造,然后才能使用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值