c# - 在哪里初始化专门的 wpf 控件?

标签 c# wpf oop

假设我想创建一个专门的 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/

相关文章:

java - 从抽象类创建对象实例

c# - 如何在 Fluent-NHibernate 中级联插入父级、子级和组合列表

c# - RegisterForContextMenu 似乎没有效果

c# - 回滚对 Entity Framework .NET 中的数据库所做的更改

c# - 如何在 WPF 中单击后释放按钮?

c# - 更改启动画面的持续时间?

wpf - 工具提示放置-WPF

java - 作为方法的结果返回对象

c# - 关于具有私有(private)、公共(public)和 protected 构造函数的抽象类的一些问题

c# - 使用Mutex同步C#对象: issue with call to ReleaseMutex() in C# object destructor