我是WPF的新手,过去我使用过Windows窗体。我在这里有个问题,我想找人向我解释。下面是一个非常简单的例子。
我有一个XAML页面,其中有一个复选框、一个按钮和一个文本字段。默认情况下,选中复选框。
当未选中复选框时,我希望启用按钮和文本字段。
private void UseDefaultFoldersCB_Checked(object sender, RoutedEventArgs e)
{
//MessageBox.Show("");
if (StartDirLocationTB.IsEnabled == false)
{
StartDirLocationTB.IsEnabled = true;
}
if (SelectStartLocationBtn.IsEnabled == false)
{
SelectStartLocationBtn.IsEnabled = true;
}
}XAML:
<CheckBox Content="Use Default Folders" IsChecked="True" Height="16" HorizontalAlignment="Left" Margin="10,14,0,0" Name="UseDefaultFoldersCB" VerticalAlignment="Top" Checked="UseDefaultFoldersCB_Checked" />
<TextBox Height="23" IsEnabled="False" HorizontalAlignment="Left" Margin="9,38,0,0" Name="StartDirLocationTB" VerticalAlignment="Top" Width="403" Background="WhiteSmoke" />
<Button Content="Select Start Folder" IsEnabled="False" Height="23" HorizontalAlignment="Right" Margin="0,38,6,0" Name="SelectStartLocationBtn" VerticalAlignment="Top" Width="139" />堆栈跟踪:
System.NullReferenceException未被用户代码处理 Message=Object引用未设置为对象的实例。 在TestProject.MainWindow.UseDefaultFoldersCB_Checked(Object发件人,在C:\Users\jc\Desktop\Test\TestProject\MainWindow.xaml.cs:line 611中的Source=TestProject StackTrace,在System.Windows.EventRoute.InvokeHandlersImpl(Object源,RoutedEventArgs args,Boolean )在System.Windows.UIElement.RaiseEventImpl(DependencyObject发件人,RoutedEventArgs args)在System.Windows.Controls.Primitives.ToggleButton.OnIsCheckedChanged(DependencyObject d,( System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) )( System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) )( System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) )( System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata元数据,EffectiveValueEntry oldEntry,EffectiveValueEntry& newEntry,Boolean,Boolean,OperationType operationType),System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp,Object value,PropertyMetadata元数据,( System.Windows.DependencyObject.SetValue(DependencyProperty dp中的布尔coerceWithDeferredReference,布尔coerceWithCurrentValue,OperationType operationType,布尔isInternal) ( at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst,XamlMember属性,Object值)
当我从Visual启动应用程序时,我会得到上述代码的NullReferenceException。为什么在应用程序启动时执行此代码?我认为它只在复选框被选中/未选中时才会执行?为什么是NullReferenceException?
谢谢。
发布于 2011-06-13 09:08:42
您收到此事件处理程序调用的原因是,在初始化页面时,XAML参数会看到一个事件附加到复选框的选中属性(即,当复选框IsChecked属性为true时将调用该事件),因此它在加载自身时调用该事件。
我建议您使用复选框的Click,以便每当复选框状态发生更改时,您就可以拥有一个事件。
所以你的XAML会是这样的。
<CheckBox Content="Use Default Folders" IsChecked="True" Height="16" HorizontalAlignment="Left" Margin="10,14,0,0" Name="UseDefaultFoldersCB" VerticalAlignment="Top" Click="UseDefaultFoldersCB_Click" />
<TextBox Height="23" IsEnabled="False" HorizontalAlignment="Left" Margin="9,38,0,0" Name="StartDirLocationTB" VerticalAlignment="Top" Width="403" Background="WhiteSmoke" />
<Button Content="Select Start Folder" IsEnabled="False" Height="23" HorizontalAlignment="Right" Margin="0,38,6,0" Name="SelectStartLocationBtn" VerticalAlignment="Top" Width="139" />而Eventhandler代码与..。
private void UseDefaultFoldersCB_Click(object sender, RoutedEventArgs e)
{
//MessageBox.Show("");
if (StartDirLocationTB.IsEnabled == false)
{
StartDirLocationTB.IsEnabled = true;
}
if (SelectStartLocationBtn.IsEnabled == false)
{
SelectStartLocationBtn.IsEnabled = true;
}
}发布于 2011-06-13 09:29:18
答案是停止编码,就像您在WinForms中一样。使用Databinding代替。我给你找到了一个很好的样本这里。如果您仍然希望在事件处理程序中执行此操作,请将其保存在“选中”事件中,只需添加空检查即可。如果使用Click事件,键盘快捷键将无法工作。空检查样例:
private void UseDefaultFoldersCB_Checked(object sender, RoutedEventArgs e)
{
if (StartDirLocationTB != null && StartDirLocationTB.IsEnabled == false)
{
StartDirLocationTB.IsEnabled = true;
}
if (SelectStartLocationBtn != null && SelectStartLocationBtn.IsEnabled == false)
{
SelectStartLocationBtn.IsEnabled = true;
}
}发布于 2011-06-13 09:06:09
XAML中的属性设置程序将引发与这些属性相关的事件,就好像它们是在代码中设置的一样(或多或少)。我相信,在XAML解析器通过您的IsChecked="True“设置属性时,事件处理程序会触发--此时您在XAML中定义的其他对象还没有被实例化。
(顺便提一句,这是Silverlight和WPF在细节上往往不同的地方之一)。
https://stackoverflow.com/questions/6328262
复制相似问题