问题是这样的,代码段如下
<RadioButton Name="RadioA" GroupName="hello" Canvas.Top="0" Canvas.Left="0" Checked="RadioButton_Checked" DataContext="0,0" IsChecked="True">(0,0)</RadioButton> <Button Name="myButton" Canvas.Left="100" Canvas.Top="100" Width="100" Height="70" Click="myButton_Click">
我设置了IsChecked为true,那么程序启动时就要执行
RadioButton_Checked这个事件,这个事件如下
1 private void RadioButton_Checked(object sender, RoutedEventArgs e) 2 { 3 4 myButton.RenderTransformOrigin = p; 5 }
那么,这个程序是要报错的,出错显示myButton为空,为什么会这样?是因为这样mybutton没初始出来?用winform测试了一下,没有这种问题,但是,winfrom貌似一开始不执行
RadioButton_CheckedChanged这个事件?这是wpf的bug么?
后来再研究了下,发现这样是可以避免mybutton为空这种错误的
在构造函数里来设置IsChecked属性
public MainWindow() { this.InitializeComponent(); // 在此点下面插入创建对象所需的代码。 RadioA.IsChecked = true; }
同样,winform里面这样设置,程序执行的时候,它又执行了
RadioButton_CheckedChanged这个事件。
彻底晕了,哪位朋友帮我想想,wpf里面,IsChecked那样设置为什么就要报错,谢谢啦
两点:
1.WPF窗体的初始化事件里会执行所有控件的初始化
2.WPF里的属性触发器不等同于winform的事件监控机制.也就是即使没有用户点击或钩选等操作,属性修改就会触发Checked等事件.
所以,在初始化RadioButton控件时,会设置IsChecked属性,于是触发了Checked事件,而此时另一个控件尚未初始化,所以对其的引用当然会报错.
谢谢,现在更清楚了
厉害啊