【问题标题】:WPF Control: where is "OnLoaded" virtual function?WPF 控件:“OnLoaded”虚函数在哪里?
【发布时间】:2011-07-04 07:01:05
【问题描述】:

在WinForm的控件中,有一个OnLoaded虚函数,但是WPF控件中好像没有这个。我发现这个功能在某些情况下非常有用。例如,在控件“完全”初始化后,我可以在这里做一些事情。在WPF控件中,有一个OnInitialized虚函数,但是这个函数是从InitializeComponent函数中调用的,这个函数太早了,并且不允许派生类建立。是否有任何理由不在 WPF 中提供此功能?还是我错过了什么?

【问题讨论】:

    标签: wpf controls


    【解决方案1】:

    您可以附加到 Window 对象的 Loaded 事件,并在事件处理程序中执行您想要执行的操作(假设您使用的是 c#):

    public MyWindow() //constructor
    {
      this.Loaded += MyWindow_Loaded;
    }
    
    private void MyWindow_Loaded(object sender, RoutedEventArgs e)
    {
      // do your stuff here
    }
    

    【讨论】:

    • 我知道我可以像这样解决它,但我更好奇为什么 WPF 删除了该功能。其实我也很纳闷,为什么 OnLoaded 在 WPF Window 中作为虚函数被去掉了。现在,我必须做这个额外的钩子来取回我的 Loaded 函数。为什么?
    • @miliu:我认为主要原因是在 WinForms 中,OnLoad 是(基于事件的)系统中非常重要的一部分。某些事情只能在应用程序生命周期的那个时刻完成。然而,在 WPF 中,并没有真正需要将此事件处理程序公开给用户。框架不使用它(因此它不是虚拟的),那你为什么要呢?
    • 谢谢。这听起来很合理。
    【解决方案2】:

    你会找FrameworkElement.EndInit()

    这将在元素的初始化过程之后起作用...

    【讨论】:

    • 我不明白 EndInit() 函数如何帮助我。能详细点吗?
    • 正如您在问题中提到的"I could do something here after the control is "completely" initialized"
    • 控件完全初始化后不会调用EndInit。它在 OnApplyTemplate 之前调用。
    猜你喜欢
    • 2010-10-24
    • 2011-07-21
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2012-12-15
    • 2014-08-08
    相关资源
    最近更新 更多