我是WPF的新手,过去我使用的是Windows Forms.我在这里有一个问题,我喜欢有人向我解释.以下是一个非常简单的例子.
我有一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
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" />
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
用户代码未处理System.NullReferenceException
消息=未将对象引用设置为对象的实例.
Source = TestProject StackTrace:位于C:\ Users\jc\Desktop\Test\TestProject\MainWindow.xaml.cs中的TestProject.MainWindow.UseDefaultFoldersCB_Checked(Object sender,RoutedEventArgs e):System.Windows.EventRoute.InvokeHandlersImpl中的第611行(对象在System.Windows.DependencyObject.OnPropertyChanged的System.Windows.Controls.Primitives.ToggleButton.OnIsCheckedChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)上的System.Windows.UIElement.RaiseEventImpl(DependencyObject sender,RoutedEventArgs args)中的source,RoutedEventArgs args,Boolean reRaised) (DependencyPropertyChangedEventArgs e)上System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)上System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs参数)在System.Windows.DependencyObject.UpdateEffectiveValue(entryIndex entryIndex,的DependencyProperty DP,PropertyMetadata元数据,EffectiveValueEntry oldEntry,EffectiveValueEntry& newEntry,Boolean coerceWithDefer System.Reader.DependencyObject.SetValue(DependencyProperty dp,对象值)在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst,XamlMember属性,Object value)
当我从Visual Studio启动应用程序时,我在上面的代码中得到一个NullReferenceException.为什么在应用程序启动时执行此代码?我曾经以为它只会在选中/取消选中复选框时执行?为什么NullReferenceException?
谢谢.
答案是停止编码,就好像你在WinForms中一样.请改用数据绑定.我在这里找到了一个很好的样品.如果您仍想在事件处理程序中执行此操作,请将其保留在"已检查"事件中,并添加空检查.如果您使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
您收到此事件处理程序调用的原因是因为在初始化 Page 时,XAML 解析器发现一个事件附加到 Checkbox 的 Checked 属性(即,当复选框 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" />
Run Code Online (Sandbox Code Playgroud)
并且事件处理程序代码保持相同..
private void UseDefaultFoldersCB_Click(object sender, RoutedEventArgs e)
{
//MessageBox.Show("");
if (StartDirLocationTB.IsEnabled == false)
{
StartDirLocationTB.IsEnabled = true;
}
if (SelectStartLocationBtn.IsEnabled == false)
{
SelectStartLocationBtn.IsEnabled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4989 次 |
| 最近记录: |