- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想创建一个专门的 wpf 控件“YellowTextBox”。它将与普通文本框相同,但它将是……黄色!好的,我去编码:
public class YellowTextBox: TextBox
{
}
现在,最明显的部分是,我希望它是黄色的...
this.Background = Brushes.Yellow;
我把那行代码放在哪里?在构造函数中?在 OnInitialized 覆盖? OnLoaded 等...
有一些正确(或更好)的地方可以放置那行代码吗?
编辑:
我知道我可以通过样式来做到这一点,我的问题更像是一种“OOP”方式,它可以是任何其他类型的属性或字段,不完全是背景颜色,所选属性只是一个例子:/
最佳答案
您真的应该在依赖属性(对于它引入的属性)的初始化器中初始化一个专门的 WPF 控件,并在默认的 Style
中(对于新属性,以及它继承的任何东西)需要不同的默认值)。
但出于某种原因,您想在 C# 中执行此操作。
在那种情况下,我们谈论的是 a) OOP 神学,b) OOP 现实,以及 C) WPF 机制。就所有而言,在构造函数中执行,在 WPF 中,在 InitializeComponent()
之后的构造函数中执行(如果适用,不是你的情况)被调用。这将在 WPF 中应用于控件的任何样式之前,并且它是很好的 OOP 实践和神学来初始化构造函数中您没有在字段初始值设定项中初始化的所有内容。类的新实例应该准备就绪,处于一致的状态,如果您开始使用它就不会抛出任何异常。所以这意味着初始化应该在那时全部完成。永远不要将任何初始化留给其他人。那是一个陷阱。
请继续阅读 InitializeComponent()
,但在您的特定情况下,标准控件的子类的构造函数,您不会调用它。
WPF 中的控件子类将在构造函数之后应用样式。它必须!在构造函数执行之前,它不存在。 “在构造函数之后”基本上就是全部,除了构造函数本身的内脏。您可以覆盖 OnApplyTemplate()
以在应用模板 后立即 Hook 。但这太晚了,不能进行太多初始化(除了将引用模板子项的私有(private)字段)。
因此,如果您在构造函数中初始化内容,它会应用于每个实例,如果它是 WPF 控件类(或任何 FrameworkElement
子类),您类的使用者可以通过应用 Style
或稍后的模板。这是 WPF 的良好做法:您希望允许人们最大范围地自定义您的控件。
关于c# - 在哪里初始化专门的 wpf 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586737/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!