none
silverlight4中有没有Html的dom中的onload事件,在元素都加载好后执行? RRS feed

  • 问题

  • 我有一个Canvas,我会在初始化程序时动态生成多个元素,放入到canvas中,元素分布在不同的位置。

    sl中有个ActualWidth属性可以用来获取到实际的长宽,但是要元素在界面上显示出来才可以获得值。

    我想根据canvas中的元素,在最右边和最下边的元素的绝对定位+元素的实际长宽,来动态改变canvas的长宽。

    在html中,元素加载完成,有个onload事件表示dom加载完成后执行。

    sl4中有没有什么方法或者事件是在控件都加载完成并显示好后,有了ActualWidth值后触发的方法或者事件?

    谢谢了。

    2011年3月29日 6:02

答案

  • 您好,

    您可以試試看在Loaded事件中取得ActualWidth屬性

    public MainPage()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }
    
    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Dispatcher.BeginInvoke(delegate { //取得ActualWidth值 });
    }
    

     

     


    • 已标记为答案 平步 2011年4月2日 6:23
    2011年3月29日 10:33
  • 根据帮助文档上的说明,

    可以在SizeChanged和LayoutUpdated中获得ActualWidth的值。这两个方法在可视化树创建好后执行。

    有个缺点就是,只要有Size改变,就会触发这个事件,不能保证只执行一次,得要写代码来控制。

    • 已标记为答案 平步 2011年4月2日 6:23
    2011年3月30日 2:14

全部回复

  • 您好,

    您可以試試看在Loaded事件中取得ActualWidth屬性

    public MainPage()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }
    
    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Dispatcher.BeginInvoke(delegate { //取得ActualWidth值 });
    }
    

     

     


    • 已标记为答案 平步 2011年4月2日 6:23
    2011年3月29日 10:33
  • 如果你的动态元素都是下载加载的 你只能用接受网络数据进度事件当提示
    2011年3月29日 10:33
  • 您好,

    您可以試試看在Loaded事件中取得ActualWidth屬性

    public MainPage()
    
    {
    
      InitializeComponent();
    
      this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    
    }
    
    
    
    void MainPage_Loaded(object sender, RoutedEventArgs e)
    
    {
    
      Dispatcher.BeginInvoke(delegate { //取得ActualWidth值 });
    
    }
    
    

     

     


     

    非常感谢给出的方法。可以正确得到ActualWidth的值。

    你的方法好像使用的是线程异步的方法来完成的,让我又学习到了一个新的思路。不过对于异步的这个方法不太了解。

    下面这个是帮助文档上的说明:

    Silverlight 中 Loaded 事件的执行时间不同于 WPF 中 FrameworkElement.Loaded 事件的执行时间。具体地说,WPF Loaded 事件在应用模板之后发生。在 Silverlight 中,Loaded 事件并不一定在应用模板之后发生。如果对以下相对常见的控件方案使用 Loaded 事件,这可能是一个问题:您希望检查可视化树,以获得作为其他对象的源的值或更改模板化组合(您只有在运行时才能从中知道新值)中的值。在这种情况下,调用 SilverlightVisualTreeHelper 方法来检查模板内容的可视化树可能不起作用(如果直接从 Loaded 处理程序进行调用)。

    其中(您只有在运行时才能从中知道新值)我的理解是,就是元素在浏览器上显示出来,可视化树就创建好了,也就是在这之后可以获取到ActualWidth的值。

    你的这个异步的方法,确实不错,但是我有个疑问,就是这个异步既然是采用线程的方式,那么怎么保证这个线程的执行在可视化树创建好之后执行的呢?这个线程要是先于可视化树的创建,那么按理解,还是不可以获取到ActualWidth的值。

    谢谢。

    • 已编辑 平步 2011年3月30日 2:10 添加引用
    2011年3月30日 2:08
  • 根据帮助文档上的说明,

    可以在SizeChanged和LayoutUpdated中获得ActualWidth的值。这两个方法在可视化树创建好后执行。

    有个缺点就是,只要有Size改变,就会触发这个事件,不能保证只执行一次,得要写代码来控制。

    • 已标记为答案 平步 2011年4月2日 6:23
    2011年3月30日 2:14
  • 非常感谢给出的方法。可以正确得到ActualWidth的值。

    你的方法好像使用的是线程异步的方法来完成的,让我又学习到了一个新的思路。不过对于异步的这个方法不太了解。

    下面这个是帮助文档上的说明:

    Silverlight 中 Loaded 事件的执行时间不同于 WPF 中 FrameworkElement.Loaded 事件的执行时间。具体地说,WPF Loaded 事件在应用模板之后发生。在 Silverlight 中,Loaded 事件并不一定在应用模板之后发生。如果对以下相对常见的控件方案使用 Loaded 事件,这可能是一个问题:您希望检查可视化树,以获得作为其他对象的源的值或更改模板化组合(您只有在运行时才能从中知道新值)中的值。在这种情况下,调用 SilverlightVisualTreeHelper 方法来检查模板内容的可视化树可能不起作用(如果直接从 Loaded 处理程序进行调用)。

    其中(您只有在运行时才能从中知道新值)我的理解是,就是元素在浏览器上显示出来,可视化树就创建好了,也就是在这之后可以获取到ActualWidth的值。

    你的这个异步的方法,确实不错,但是我有个疑问,就是这个异步既然是采用线程的方式,那么怎么保证这个线程的执行在可视化树创建好之后执行的呢?这个线程要是先于可视化树的创建,那么按理解,还是不可以获取到ActualWidth的值。

    您好,

    您可以參考一下下面這篇文章

    http://www.mostlydevelopers.com/blog/post/2008/10/17/get-actualwidth-and-actualheight-in-silverlight.aspx


    2011年3月30日 3:04