子类XAML中父类公共对象为空问题及UserControl代码咨询
解决子类XAML中继承自父类的公共对象为空的问题
我之前也踩过这个坑!你遇到的问题本质是WPF/XAML的控件初始化顺序导致的:子类的构造函数和InitializeComponent执行时,父类的那些公共控件还没完成实例化,所以直接访问就会得到null。
先确认下你的父类MyUserControl1的设置是对的——已经给MyGrid和MyTextBox加上了x:FieldModifier="public",这一步没问题。接下来给你两个靠谱的解决方法:
方法一:在Loaded事件中访问父类控件
Loaded事件会在整个控件树(包括父类的所有控件)都加载完成后触发,这时候父类的公共对象肯定已经初始化好了。
比如你的子类XAML(假设叫MyUserControl2.xaml):
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Test.CustomControls" x:Class="Test.CustomControls.MyUserControl2" Loaded="UserControl_Loaded"> <!-- 子类自定义内容 --> </UserControl>
子类后台代码:
public partial class MyUserControl2 : MyUserControl1 { public MyUserControl2() { InitializeComponent(); // 这里直接访问MyGrid/MyTextBox会返回null,别在这里操作! } private void UserControl_Loaded(object sender, RoutedEventArgs e) { // 现在可以安全操作父类的公共控件了 if (MyGrid != null) { MyTextBox.Text = "子类修改后的文本"; MyGrid.Background = Brushes.LightGray; } } }
方法二:重写OnInitialized方法
如果想比Loaded更早一点处理(比如初始化一些属性),可以重写父类的OnInitialized方法,这个方法会在控件初始化完成后立即触发,同样能保证父类控件已经实例化:
public partial class MyUserControl2 : MyUserControl1 { public MyUserControl2() { InitializeComponent(); } protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); // 一定要先调用父类的方法 // 这里直接操作父类控件即可 MyTextBox.Foreground = Brushes.Blue; MyGrid.Margin = new Thickness(10); } }
为什么构造函数里访问会为空?
简单说:子类的InitializeComponent()会优先处理自己的XAML内容,父类的控件实例化是在子类初始化流程之后才完成的,所以构造函数执行时,父类的MyGrid和MyTextBox还没被创建出来,自然就是null啦。
内容的提问来源于stack exchange,提问作者Muzib
相关产品推荐
相关产品推荐

