首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF - NullReferenceException on isEnabled

WPF - NullReferenceException on isEnabled
EN

Stack Overflow用户
提问于 2011-06-13 08:40:10
回答 4查看 5.7K关注 0票数 5

我是WPF的新手,过去我使用过Windows窗体。我在这里有个问题,我想找人向我解释。下面是一个非常简单的例子。

我有一个XAML页面,其中有一个复选框、一个按钮和一个文本字段。默认情况下,选中复选框。

当未选中复选框时,我希望启用按钮和文本字段。

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-13 09:08:42

您收到此事件处理程序调用的原因是,在初始化页面时,XAML参数会看到一个事件附加到复选框的选中属性(即,当复选框IsChecked属性为true时将调用该事件),因此它在加载自身时调用该事件。

我建议您使用复选框的Click,以便每当复选框状态发生更改时,您就可以拥有一个事件。

所以你的XAML会是这样的。

代码语言:javascript
复制
<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代码与..。

代码语言:javascript
复制
private void UseDefaultFoldersCB_Click(object sender, RoutedEventArgs e)
{
      //MessageBox.Show("");
      if (StartDirLocationTB.IsEnabled == false)
      {
           StartDirLocationTB.IsEnabled = true;
      }

      if (SelectStartLocationBtn.IsEnabled == false)
      {
            SelectStartLocationBtn.IsEnabled = true;
      }
}
票数 4
EN

Stack Overflow用户

发布于 2011-06-13 09:29:18

答案是停止编码,就像您在WinForms中一样。使用Databinding代替。我给你找到了一个很好的样本这里。如果您仍然希望在事件处理程序中执行此操作,请将其保存在“选中”事件中,只需添加空检查即可。如果使用Click事件,键盘快捷键将无法工作。空检查样例:

代码语言:javascript
复制
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;
    }
}
票数 6
EN

Stack Overflow用户

发布于 2011-06-13 09:06:09

XAML中的属性设置程序将引发与这些属性相关的事件,就好像它们是在代码中设置的一样(或多或少)。我相信,在XAML解析器通过您的IsChecked="True“设置属性时,事件处理程序会触发--此时您在XAML中定义的其他对象还没有被实例化。

(顺便提一句,这是Silverlight和WPF在细节上往往不同的地方之一)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6328262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档