none
Silverlight中真正的Loaded事件 RRS feed

  • 常规讨论

  • Silverlight中真正的Loaded事件

    发布于:2008-07-14 08:32:22 作者:Allan(李超) 来源:allan.flashempire.net/blog 访问:12次 文字:

      做了一些Silverlight开发应该知道,在Loaded事件之后的那个handler之中,画面并没有实际的被layout出来,在Loaded的时候是获得不了ActualWidth或其它相关值的,而只有在Layoutupdated事件中才能获得,但Layoutupdated事件是经常会运行,容易消耗资源,因此有必要找到一个方法,在画面正确渲染出来后,也就是被layouted时,来进行一些操作,之前在WPF中采用过这样一个方法,在这几天也在想办法在Silverlight找寻类似的方法,结论代码如下:



     
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
    //构造中加Loaded事件 Loaded+=new RoutedEventHandler(Page_Loaded);   //Loaded Event handler void Page_Loaded(object sender, RoutedEventArgs e) { Debug.WriteLine("Loaded Event:"+this.ActualWidth);   Thread thread = new Thread(new ThreadStart(() => { this.Dispatcher.BeginInvoke(new Action(() => { Debug.WriteLine("Thread Start After Loaded Event:" + ActualWidth); }));   }));   thread.Start(); }

      输出结果:



    1 2 
    Loaded Event:0 Thread Start After Loaded Event:400
     

      在我的项目中已经能很准确的获得ActualWidth,未经更复杂的layout情况下的证实,但我想应该是目前我能用到的唯一的解决方案,在构造中调用线程也是一样的效果,简单写一下,可以像有一个UILoaded事件一样:



    public partial class Page : UserControl { public Page() { InitializeComponent(); (new Thread(new ThreadStart(() => { Dispatcher.BeginInvoke(UILoaded); }))).Start(); }     void UILoaded() { Debug.WriteLine("UILoaded:" + ActualWidth); } }

    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com

    2009年3月11日 7:47
    版主