Office控件开发总结-开发Windows 窗体控件简单概述
1.1. Windows窗体控件的种类及介绍
Windows 窗体支持三种用户定义的控件:复合、扩展和自定义。
复合控件是通过从 UserControl 类继承创建的控件。复合控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许您有选择地公开和绑定它们的属性。复合控件还提供了大量的默认键盘处理功能,您不需要任何额外的开发。
扩展控件是通过从现有的 Windows 窗体控件类继承创建的控件。此方法使您得以保留 Windows 窗体控件的所有固有功能,然后通过添加自定义属性、方法或其他功能扩展此固有功能。可以使用此选项重写基控件的绘制逻辑,然后更改该控件的外观以扩展其用户界面。
自定义控件是通过从 Control 类继承创建的控件。Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供控件特定的功能或图形界面。
1.2. 如何对Windows 窗体控件进行属性、方法和事件的定义及执行
以下代码片段为自定义控件OfficeEmbedCtl定义了一个名为RefillVisible的自定义属性。
public partial class OfficeEmbedCtl : UserControl {
...
private bool _refillVisible;
///<summary>
/// 重新填充按钮是否显示
///</summary>
[Category("行为"), Description("重新填充按钮是否显示")]
public bool RefillVisible
{
get
{
return _refillVisible;
}
set
{
_refillVisible = value;
}
}
...
}
以下代码片段说明了OfficeEmbedCtl自定义控件如何定义自定义事件 ValueChanged。
public partial class OfficeEmbedCtl : UserControl {
...
private EventHandler onValueChanged;
///<summary>
/// 值改变时发生
///</summary>
public event EventHandler ValueChanged
{
add
{
onValueChanged += value;
}
remove
{
onValueChanged -= value;
}
}
protected virtual void OnValueChanged(EventArgs e)
{
if (ValueChanged != null)
{
ValueChanged(this, e);
}
}
...
}
1.3. 如何对 Windows 窗体控件进行线程安全调用
以下代码片段说明了OfficeEmbedCtl自定义控件如何对窗体控件进行线程安全调用。
public partial class TemplateForm : BaseForm {
...
private void officeEmbedCtl1_ImportExcelClick(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(delegate()
{
Invoke(new MethodInvoker(delegate
{
OpenFileDialog file = new OpenFileDialog();
file.Filter = "Excel 工作簿(*.xlsx)|*.xlsx";
if (file.ShowDialog(this) == DialogResult.OK)
{
officeEmbedCtl1.ImportExcel(file.FileName);
}
}));
}));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
...
}