ComboBox 使 WPF 应用程序崩溃,因为 SelectionChanged 触发得太早
ComboBox crashing WPF application because SelectionChanged is firing too soon
这是我的 XAML:
<ComboBox x:Name="cloneSelector"
Width="80"
SelectedIndex="0"
VerticalAlignment="Top"
Margin="10"
SelectionChanged="cloneSelector_SelectionChanged">
<ComboBoxItem Content="All" />
<ComboBoxItem Content="Top" />
<ComboBoxItem Content="Middle" />
<ComboBoxItem Content="Bottom" />
<ComboBoxItem Content="None" />
</ComboBox>
这是 SelectionChanged 处理程序(根据评论要求):
cloneSelection = (CloneFormat) cloneSelector.SelectedIndex;
var frameSize = videoDevice.VideoResolution.FrameSize;
switch (cloneSelection)
{
case CloneFormat.Top:
cloneRect = new Rectangle(0, 0, frameSize.Width, (frameSize.Width* 9) / 16);
break;
case CloneFormat.Middle:
cloneRect = new Rectangle(0, 100, frameSize.Width, (frameSize.Width* 9) / 16);
break;
case CloneFormat.Bottom:
cloneRect = new Rectangle(0, 200, frameSize.Width, (frameSize.Width* 9) / 16);
break;
default:
cloneRect = new Rectangle(0, 0, frameSize.Width, frameSize.Height);
break;
}
如果删除 SelectedIndex
、SelectionChanged
处理程序或 ComboBoxItems
,我的应用程序将运行。问题似乎是处理程序访问 cloneSelector
过早并抛出空对象异常。有没有一种简单的方法可以防止这种行为,同时仍然保持我的功能(即不让 SelectedIndex 从 -1 开始)?
此外,如果我没有如此频繁地测试我的项目,我将不知道我做了什么来破坏它。它成功构建并静默失败。当我调试时,No Symbols Loaded 设计器中的 Exception Unhandled 框显示
System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation.'
Inner Exception
NullReferenceException: Object reference not set to an instance of an object.
而且我可以看到它是在 PresentationFramework.dll 中抛出的,但它没有提供有关什么是 null 或什么导致错误的信息。我如何获得更好的调试信息,即让它告诉我 ComboBox
是崩溃的根源?
事实证明我的 ComboBox
甚至不是空引用,它是我的视频分辨率对象。更重要的是我需要更具体的调试信息。
这是我的 XAML:
<ComboBox x:Name="cloneSelector"
Width="80"
SelectedIndex="0"
VerticalAlignment="Top"
Margin="10"
SelectionChanged="cloneSelector_SelectionChanged">
<ComboBoxItem Content="All" />
<ComboBoxItem Content="Top" />
<ComboBoxItem Content="Middle" />
<ComboBoxItem Content="Bottom" />
<ComboBoxItem Content="None" />
</ComboBox>
这是 SelectionChanged 处理程序(根据评论要求):
cloneSelection = (CloneFormat) cloneSelector.SelectedIndex;
var frameSize = videoDevice.VideoResolution.FrameSize;
switch (cloneSelection)
{
case CloneFormat.Top:
cloneRect = new Rectangle(0, 0, frameSize.Width, (frameSize.Width* 9) / 16);
break;
case CloneFormat.Middle:
cloneRect = new Rectangle(0, 100, frameSize.Width, (frameSize.Width* 9) / 16);
break;
case CloneFormat.Bottom:
cloneRect = new Rectangle(0, 200, frameSize.Width, (frameSize.Width* 9) / 16);
break;
default:
cloneRect = new Rectangle(0, 0, frameSize.Width, frameSize.Height);
break;
}
如果删除 SelectedIndex
、SelectionChanged
处理程序或 ComboBoxItems
,我的应用程序将运行。问题似乎是处理程序访问 cloneSelector
过早并抛出空对象异常。有没有一种简单的方法可以防止这种行为,同时仍然保持我的功能(即不让 SelectedIndex 从 -1 开始)?
此外,如果我没有如此频繁地测试我的项目,我将不知道我做了什么来破坏它。它成功构建并静默失败。当我调试时,No Symbols Loaded 设计器中的 Exception Unhandled 框显示
System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation.'
Inner Exception
NullReferenceException: Object reference not set to an instance of an object.
而且我可以看到它是在 PresentationFramework.dll 中抛出的,但它没有提供有关什么是 null 或什么导致错误的信息。我如何获得更好的调试信息,即让它告诉我 ComboBox
是崩溃的根源?
事实证明我的 ComboBox
甚至不是空引用,它是我的视频分辨率对象。更重要的是我需要更具体的调试信息。