C#为什么强制转换后为null
|
大家好,请帮我,我很困惑为什么我的代码在转换后为空
这是我有的XAML代码
<Window.Resources>
<Style x:Key=\"Menu\" TargetType=\"{x:Type Border}\">
<Setter Property=\"BorderThickness\" Value=\"0\" />
<Setter Property=\"Background\" Value=\"Transparent\" />
<Setter Property=\"Width\" Value=\"25\" />
<EventSetter Event=\"MouseLeftButtonUp\" Handler=\"Menu_MouseLeftButtonUp\" />
</Style>
</Window.Resources>
<Grid>
<Border Name=\"BorderCloseWindow\" CornerRadius=\"0,8,0,0\"
Style=\"{StaticResource Menu}\">
<Image Source=\"pack://application:,,,/images/icons/CloseSTD.png\" />
</Border>
</Grid>
这是处理边框的C#
private void Menu_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
Border b = e.Source as Border;
if (b.Name == \"BorderCloseWindow\")
{
this.Close();
}
}
如果我在边框上按下鼠标按钮,将出现这样的错误
你调用的对象是空的。
发生在
if(b.Name == \"BorderCloseWindow\")
请帮我为什么给空?以及如何修复程序以便可以运行。
没有找到相关结果
已邀请:
6 个回复
孤捷侩
或者您也可以通过投射发件人而不是e.Source来获取边框对象。
铰齐插
不是of5ѭ类型。 您应该解决的第一件事是演员表。您正在使用
如果
不是Border,则返回
,导致随后的NullReferenceException。由于事后不检查null,因此应使用常规的强制类型转换:
这不会解决您的根本问题,但可以确保 您得到了潜在问题的正确例外(an10ѭ,而不是
),并且 错误实际上是导致问题的原因所在的行(而不是下面的
,这完全是无辜的)。 现在,第二件事是问题的根源:
不是事件处理程序所附加的边界(即,不是处理事件的控件)。引发事件的控件,可能是边框内的图像。有关详细信息,请参见RoutedEventArgs.Source文档。 因此,要解决此问题,请使用发件人而不是
:
傻寺俊擒
,请尝试将发件人首先设置为Border:
如果没有帮助,只需在处理程序中设置断点,然后打开监视窗口即可看到
和
的实际类型。
辽躺
的行为。这样制作,以便您可以轻松地检查它是否已完成。如果你写
它会扔出10英镑。 其次,“ 4”包含您实际单击的对象,在本例中为“ 24”。如果要访问处理事件的对象,请使用“ 18”参数。 因此,您的代码应如下所示:
甚至更好,只是
如果为每个您要处理某些事件的“ 28”设置不同的处理程序方法,这将起作用。它不那么脆弱:如果更改ѭ5的名称(甚至不需要命名),它仍然可以工作,并且如果您不小心更改了XAML或C#中方法的名称,则很可能得到一个编译时错误。
递劝臼类洪
触发事件时,所需的信息将被写入“输出窗口”。您可能需要使用Visual Studio的“查看”菜单使其可见。然后,您将能够查看正在发生的情况并自行解决。
拟僚疽刊剔