【问题标题】:Where initialize a specialized wpf control?在哪里初始化一个专门的wpf控件?
【发布时间】:2016-08-03 20:39:27
【问题描述】:

假设我想创建一个专门的 wpf 控件“YellowTextBox”。它与普通的 TextBox 相同,但会是……黄色的!好的,我去代码:

public class YellowTextBox: TextBox
{
}

现在,显而易见的部分,我希望它是黄色的......

this.Background = Brushes.Yellow;

我把那行代码放在哪里?在构造函数中?在 OnInitialized 覆盖? OnLoaded 等...

有一些正确(或更好)的地方可以放置那行代码吗?

编辑:
我知道我可以通过样式来做到这一点,我的问题更像是一种“OOP”方式,它可以是任何其他类型的属性或字段,不完全是背景颜色, selected 属性只是一个例子:/

【问题讨论】:

  • 你想通过样式来做到这一点。样式应应用于您的文本框。除非您需要以某种基本方式更改它的工作方式,否则无需从 TextBox 继承。
  • 谢谢,@briantyler,我编辑以澄清我的问题
  • 如果达斯维达站在你身后让你做错了,在构造函数中做错了。
  • 您应该需要很少的(如果有的话)初始化代码,因为您应该为任何需要它的东西指定合理的默认值。除此之外,坚持自定义控件创建的既定规则,基本不会因为它是 WPF 而改变太多。请注意初始化的内容,因为您不想在可能会在外部应用的样式上大吃一惊。
  • @ClickOk 构造函数先于样式和模板的应用,所以在这种情况下,如果 Vader 站在您身后,每次您编辑任何 XAML 时都会让您窒息。良好的 WPF 做法是允许代码的使用者尽可能多地修改它。

标签: c# wpf oop


【解决方案1】:

您确实应该在依赖项属性(对于它引入的属性)和默认 Style(对于新属性以及它继承的任何需要不同默认值的属性)的初始化程序中初始化一个专门的 WPF 控件)。

但出于某种原因,您想在 C# 中执行此操作。

在这种情况下,我们讨论的是 a) OOP 神学,b) OOP 现实,以及 C) WPF 机制。就所有这些而言,在构造函数中执行它,在 WPF 中,在 InitializeComponent() 之后的构造函数中调用(如果适用,不是你的情况)。这将在应用于 WPF 中的控件的任何样式之前,并且它是良好的 OOP 实践神学来初始化您没有在字段初始化程序中初始化的构造函数中的所有内容。一个类的新实例应该准备就绪,处于一致的状态,如果你开始使用它就不会抛出任何异常。所以这意味着初始化应该在那时全部完成。永远不要将任何初始化留给其他人。这是一个陷阱。

请阅读InitializeComponent(),但在您的具体情况下,标准控件的子类的构造函数,您不会调用它。

WPF 中的控件子类将在构造函数之后应用样式。它必须!在构造函数执行之前,它是不存在的。除了构造函数本身的胆量之外,“构造函数之后”基本上就是所有内容。您可以覆盖OnApplyTemplate() 以在应用模板之后立即挂钩。但这为时已晚,无法进行大量初始化(私有字段将引用模板子级除外)。

因此,如果您在构造函数中初始化内容,它将应用于每个实例,并且如果它是 WPF 控件类(或任何 FrameworkElement 子类),您的类的使用者可以通过应用 @987654329 来覆盖它@ 或稍后的模板。这是 WPF 的良好做法:您希望允许人们最大程度地自定义您的控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多