继续上一个问题(link)
如果我想将新用户控件的字体分配给其创建者的字体,该怎么办?我应该这样做a):
newControl = new MyControl(...);
...
newControl.Font = this.Font;
或b)?
newControl = new MyControl(...);
...
newControl.Font = (Font)this.Font.Clone();
如果答案是a),如果创建者的字体被处理掉(例如,用户关闭的窗口),新用户控件的字体会发生什么?
谢谢,
吉尔伯特
答案 0 :(得分:0)
如果你试图对你的应用程序强制执行一个恒定的外观/感觉...比如所有表格中使用字体X,大小Y,颜色Z的所有标签,我会从标签中定义我自己的类,并声明这些元素具有只读GETTER调用而没有SETTER。这将防止设计者甚至序列化这些信息。因此,您在根类中更改了字体信息ONCE,并且您使用标签的所有位置都将强制使用该字体。您可能必须根据更改调整路线,但所有视觉方面都将保留。另外,我也用文本框,组合框,多行文本框,按钮,复选框完成了这项工作。效果很好。因此,当我以只读方式启动给定元素时,应用程序的构建会产生一系列关于只读属性的错误。因此,我会快速扫描并删除设计器的序列化元素并进行清理。奇迹般有效。如果这是你想要做的,我可以提供更多关于我如何实现它的示例代码。
答案 1 :(得分:0)
Font
类实际上封装了两件事:
文字样式
可用于绘制具有该样式的文本的GDI句柄
由Font
类封装的文本样式是不可变的;句柄是“一次性不可变的”,这意味着它永远不会封装除了创建它之外的任何GDI句柄,但是一旦处置Font
它就会停止封装任何字体句柄(它变得真正不可变) ,虽然没用,但在那一点上。)
设置框架中控件的Font
属性将导致它抓住两件事:
用于设置属性的Font
对象的标识,Font
属性getter仅使用
文本样式,控件将用于创建自己的私有Font
对象。
因为每个Framework控件都会固有地克隆用于设置其Font
属性的任何Font
实例,所以在使用它来设置另一个控件{{1}之前,通常不需要用户代码来克隆字体。 } property。