日期:2014-05-17  浏览次数:21262 次

WPF,控件是在什么时候初始化的?
有一段代码,寻找XAML中的元素,此元素存在于模板中。如下:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Border border = button1.Template.FindName("border", button1) as Border;
        MessageBox.Show((border == null).ToString());
    }
   private void button1_Click(object sender, RoutedEventArgs e)
    {
        Border border = button1.Template.FindName("border", button1) as Border;
        MessageBox.Show((border == null).ToString());
    }
}


在窗体的构造函数中寻找button1控件模板中的Border元素,结果没有找到,请问,这个时候为什么找不到呢?但是在button1的单击事件中却找到了。
在执行InitializeComponent方法之前,应用程序就执行了Application.LoadComponent(this, resourceLocater)静态方法,其中参数resourceLocater是XAML文档的Uri。
也就是说在窗体执行InitializeComponent()方法之前就加载了XAML文档,为什么找不到模板中的元素呢?

------解决方案--------------------
在InitializeComponent();
之后写个eventhandler
this.Loaded+=自己点下就出来了
意思是加载完成后执行 也就是初始化控件完成后会触发这个事件
------解决方案--------------------
当 XAML 放入一个 Window 对象时,无法看到它的可视树,但只要将该 Window 元素改为 Page 元素(并删除 SizeToContent 属性)就可以看到了
http://blog.csdn.net/daming_ocean/article/details/6093221

希望对你有帮助
------解决方案--------------------
引用:
在InitializeComponent();
之后写个eventhandler
this.Loaded+=自己点下就出来了
意思是加载完成后执行 也就是初始化控件完成后会触发这个事件

把你的代码放在窗体Load事件中试试,如果还是找不到,在查找控件之前调用控件的UpdateLayout方法先,如下代码所示:

this.button1.UpdateLayout()
 Border border = button1.Template.FindName("border", button1) as Border;

------解决方案--------------------
引用:
控件什么时候初始化,这个没有个定数的吗?