为什么在 Window 上打开然后关闭菜单时会出现 InvalidCastException?
Why do I get InvalidCastException when I open then close the Menu on my Window?
当我在 NET Framework 4.7.2 中创建一个新的 WPF 应用程序时,将一个菜单添加到 MainWindow,每当您单击菜单然后单击菜单以外的地方将其关闭时,我都会得到 InvalidCastException
。
当它从 PresentationFramework.dll
抛出时,我可以忽略这个异常,一切都很好我只是想知道这是 NET Framework 问题还是我做错了什么?
完整的解决方案可以在这里找到https://github.com/glrad/InvalidCastException
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
var view = new MainWindow();
MainWindow = view;
view.Show();
}
MainWindow.xaml
<Window x:Class="MyApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="GASGC3" Height="800" Width="1000">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="Options" InputGestureText="Ctrl+O"/>
<Separator/>
<MenuItem Header="Exit" InputGestureText="Alt+F4" />
</MenuItem>
<MenuItem Header="Help">
<MenuItem Header="About" />
</MenuItem>
</Menu>
</Grid>
</Window>
抛出异常:
System.InvalidCastException: 'Unable to cast object of type
'System.Collections.Hashtable' to type 'System.String'.'
您看到此异常似乎是因为您更改了 Visual Studio 中的异常设置并启用了 CLR 异常。
如果您选中抛出时中断:公共语言运行时异常,那么您将看到被捕获的异常,否则永远不会冒泡给用户。这些异常是正常的。
只有在跟踪难以发现的错误时才应启用中断 CLR 异常。通常你甚至会设置一个断点,在关闭 CLR 异常的情况下启动应用程序(以避免 运行 一直进入它们),然后,当遇到断点时,选中此选项并继续仅测试特定代码。通常你这样做,如果你想看到你已经处理并在 try-catch 语句中默默吞下的异常。
注意,这显示了已处理的异常,所以不要担心它们。
当我在 NET Framework 4.7.2 中创建一个新的 WPF 应用程序时,将一个菜单添加到 MainWindow,每当您单击菜单然后单击菜单以外的地方将其关闭时,我都会得到 InvalidCastException
。
当它从 PresentationFramework.dll
抛出时,我可以忽略这个异常,一切都很好我只是想知道这是 NET Framework 问题还是我做错了什么?
完整的解决方案可以在这里找到https://github.com/glrad/InvalidCastException
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
var view = new MainWindow();
MainWindow = view;
view.Show();
}
MainWindow.xaml
<Window x:Class="MyApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="GASGC3" Height="800" Width="1000">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="Options" InputGestureText="Ctrl+O"/>
<Separator/>
<MenuItem Header="Exit" InputGestureText="Alt+F4" />
</MenuItem>
<MenuItem Header="Help">
<MenuItem Header="About" />
</MenuItem>
</Menu>
</Grid>
</Window>
抛出异常:
System.InvalidCastException: 'Unable to cast object of type 'System.Collections.Hashtable' to type 'System.String'.'
您看到此异常似乎是因为您更改了 Visual Studio 中的异常设置并启用了 CLR 异常。
如果您选中抛出时中断:公共语言运行时异常,那么您将看到被捕获的异常,否则永远不会冒泡给用户。这些异常是正常的。
只有在跟踪难以发现的错误时才应启用中断 CLR 异常。通常你甚至会设置一个断点,在关闭 CLR 异常的情况下启动应用程序(以避免 运行 一直进入它们),然后,当遇到断点时,选中此选项并继续仅测试特定代码。通常你这样做,如果你想看到你已经处理并在 try-catch 语句中默默吞下的异常。
注意,这显示了已处理的异常,所以不要担心它们。