none
一个loaded事件时机的问题 RRS feed

  • 问题

  • 比如说有一个UserControl:
    public class Control1 : UserControl
    {
     public Control1()
     {
      InitializeComponent();
                 this.Loaded += new RoutedEventHandler(OnLoaded);
     }
     
     void OnLoaded(object sender, RoutedEventArgs e)
     {

     }
    }

    MainWindow中用到了它:
    XAML Template:
    <ControlTemplate>
     <local:Control1 />
    </ControlTemplate>

    想问一下这时为什么OnLoaded方法没有执行?

    2011年3月1日 2:48

答案

  • 根据我的经验,我觉得是因为你的这个Control1没有变的可见,这个Loaded事件只有当你这个UserControl变的可见的时候才会触发。

    比如,你把这个Control加到了一个TabControl的不可见标签中,因为这个Control不可见,所以你的Loaded事件是不会触发的。你可以检查一下这个问题。

    还有可能就是你没有进行InitializeComponent()造成的,我看你的代码应该不是这个问题。

    如果你检查了上面两项,Loaded事件依然没有触发,你可以给我提供一个小的例子重现你的问题么,这样更加有利于我解决你的问题。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 zysc 2011年3月2日 2:56
    2011年3月1日 3:04
    版主

全部回复

  • 根据我的经验,我觉得是因为你的这个Control1没有变的可见,这个Loaded事件只有当你这个UserControl变的可见的时候才会触发。

    比如,你把这个Control加到了一个TabControl的不可见标签中,因为这个Control不可见,所以你的Loaded事件是不会触发的。你可以检查一下这个问题。

    还有可能就是你没有进行InitializeComponent()造成的,我看你的代码应该不是这个问题。

    如果你检查了上面两项,Loaded事件依然没有触发,你可以给我提供一个小的例子重现你的问题么,这样更加有利于我解决你的问题。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 zysc 2011年3月2日 2:56
    2011年3月1日 3:04
    版主
  • 不好意思刚才是我的问题,不过发生这个情况是一个奇怪的原因造成的,我在MainWindow中的Onload里访问App里自定义的一个静态字段时没有成功,可是也没有报错,程序就这样跳出了MainWindow中的Onload方法,进而Control1的Onload方法也没有执行

    2011年3月1日 3:14
  • 对于这个问题我不能一下子给你找到根本原因,你能上传一个小的例子让我重现你的问题么?

    如果不能分离出一个小的例子上传,你能贴出一些关键代码么?这样有利于我分析你的问题。

    上传到Skydrive上就可以。


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月1日 3:18
    版主
  • 刚才的Control1其实是一个叫MainMenu的类

    下面这些是在MainWindow的OnLoad里的代码

    control1 = Template.FindName("control1", this) as Control1;
    control1.ABC = App.Instance.ABC;

     

    App里面有一个Instance静态属性,当程序运行到“control1.ABC = App.Instance.ABC;”时没出错也没执行成功就退出了MainWindow的OnLoad,应用程序还是启动了

    2011年3月1日 3:27
  • 这些信息是不够的,比如这个ABC是什么? 是依赖属性还是CLR属性?

    然后你根据你的类型 上网查查看看到底应该如何赋值。

    你看OutPut window里面没有异常么?


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月1日 3:38
    版主
  • 这个和ABC的属性类型应该没什么关系,访问Instance的时候已经不行了,我Debug时,Watch窗口访问App.Instance时看到一个这样的错误

    App.Instance 'System.Windows.Application' does not contain a definition for 'Instance' and no extension method 'Instance' accepting a first argument of type 'System.Windows.Application' could be found (are you missing a using directive or an assembly reference?)

    2011年3月1日 3:47
  • 你是怎么定义你的Instance的,根据错误信息,你是不能这么定义的。为什么不多提供点信息呢,而要我们来玩猜谜游戏。 这样根本就不利于帮助你来解决问题。请提供些关于你是如何改写App类的信息,部分代码就可以。否则是神仙也无能为力。猜不到你的具体代码的。

     

    J


    Best day, Best life
    2011年3月1日 5:36
  • public static App Instance { get; private set; }

    不是说不想提供因为Instance就是App里的一个静态属性,我觉得没什么可写的,初始化就在App的Startup里,就一句 Instance = this;

    2011年3月1日 7:38
  • WPF APP已经是单例了,你没有必要再为他实现一个Instance了,直接可以通过 App.Current属性拿到App的实例。 因为Application就是实现单例。

     


    Best day, Best life
    2011年3月1日 8:18
  • 你好 zysc,

    请你再看一下我的第一个回复,你确定你的UserControl已经加载了,你在你的窗口上可以看到你的UserControl了?

    根据我的经验你执行你的代码:

    control1 = Template.FindName("control1", this) as Control1;
    control1.ABC = App.Instance.ABC;

    只是拿到了Control,更改了属性,但是这些动作是不会触发你UserControl的loaded事件的。

    我刚才尝试了一下,你的那个异常不会被抛出来,而且影响我程序的Loaded事件,请你参考我的第一个回复。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月1日 8:30
    版主
  • 谢谢Sheldon _Xiao,Jarrey

    我用App.Instance而不用App.Current是因为App.Current得到的是Application,而App.Instance得到的直接是App实例,这里可以少一次类型转换,因为我在App里还定义了一些其它属性,每次都用App.Current强制转换一下类型太麻烦,对于Sheldon _Xiao说的,没Loaded的原因就是上面说的App.Instance这个东西不报错就直接退出函数,而且我调试的时候App.Current居然也不能访问,而Application.Current却可以访问,不知道和这个有没有关系,是什么原因造成的

    2011年3月1日 8:41
  • 没有关系,定义在APP里面的属性是无法在debug时候watch看到的。
    Best day, Best life
    2011年3月1日 8:53
  • 肯定是能看到的,奇怪的是App.Current属性本身都不能访问啊,Application.Current却可以
    2011年3月1日 9:16