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\")
请帮我为什么给空?以及如何修复程序以便可以运行。     
已邀请:
        看来e.Source不是Border,所以e.Source as Border为null。 源可能是边界内的另一个对象,事件已路由到边界。 您可以尝试使用以下方法测试e.Source的类型
if (e.Source is Border)
{
}
或者您也可以通过投射发件人而不是e.Source来获取边框对象。     
        显然,
e.Source
不是of5ѭ类型。 您应该解决的第一件事是演员表。您正在使用
Border b = e.Source as Border;
如果
e.Source
不是Border,则返回
null
,导致随后的NullReferenceException。由于事后不检查null,因此应使用常规的强制类型转换:
Border b = (Border)e.Source;
这不会解决您的根本问题,但可以确保 您得到了潜在问题的正确例外(an10ѭ,而不是
NullReferenceException
),并且 错误实际上是导致问题的原因所在的行(而不是下面的
if
,这完全是无辜的)。 现在,第二件事是问题的根源:
RoutedEventsArgs.Source
不是事件处理程序所附加的边界(即,不是处理事件的控件)。引发事件的控件,可能是边框内的图像。有关详细信息,请参见RoutedEventArgs.Source文档。 因此,要解决此问题,请使用发件人而不是
e.Source
Border b = (Border)sender;
    
        可能发件人为
Border
,请尝试将发件人首先设置为Border:
  Border b = sender as Border;
如果没有帮助,只需在处理程序中设置断点,然后打开监视窗口即可看到
sender
e.Source
的实际类型。     
        首先,当强制转换不成功时,这就是
as
的行为。这样制作,以便您可以轻松地检查它是否已完成。如果你写
Border b = (Border)e.Source;
它会扔出10英镑。 其次,“ 4”包含您实际单击的对象,在本例中为“ 24”。如果要访问处理事件的对象,请使用“ 18”参数。 因此,您的代码应如下所示:
private void Menu_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
    Border b = (Border)sender;
    if (b.Name == \"BorderCloseWindow\")
    {
        this.Close();
    }
}
甚至更好,只是
private void Menu_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
    this.Close();
}
如果为每个您要处理某些事件的“ 28”设置不同的处理程序方法,这将起作用。它不那么脆弱:如果更改ѭ5的名称(甚至不需要命名),它仍然可以工作,并且如果您不小心更改了XAML或C#中方法的名称,则很可能得到一个编译时错误。     
        更改代码,如下所示:
private void Menu_MouseLeftButtonUp(object sender, RoutedEventArgs e)        
{            
  System.Diagnostics.Debug.WriteLine(
    \"Sender contains an object of type {0}\", 
    sender.GetType());
  System.Diagnostics.Debug.WriteLine(
    \"e.Source contains an object of type {0}\", 
    e.Source.GetType());
}
触发事件时,所需的信息将被写入“输出窗口”。您可能需要使用Visual Studio的“查看”菜单使其可见。然后,您将能够查看正在发生的情况并自行解决。     
        e.Source是图像类型的对象。 因此,您需要将发送方强制转换为Border。 边界b =发件人为边界;     

要回复问题请先登录注册