如何在方法中获取“对象发送者”的子项?

3

我的应用程序中有一个带有图像的15个边框,当鼠标弹起时调用一个方法..所有的图像都有不同的名称..所以我希望它们都能调用这个方法

<GroupBox Width="75" Height="75">
      <Border MouseLeftButtonUp="Image_MouseUp1" Background="Transparent">
           <Image x:Name="RedPick5_Image" Height="Auto" Width="Auto"/>
      </Border>
</GroupBox>

我希望他们都能设置子级的图像源(如果我理解正确,则图像是边框的子级.. 我该如何做到这一点?)
        private void Image_MouseUp1(object sender, MouseButtonEventArgs e)
        {
            //want to set any image that calls this
            //something like Sender.Child.Source = ...
        }
3个回答

5

您需要将发送方进行转换并进行检查。

    private void Image_MouseUp1(object sender, MouseButtonEventArgs e)
    {
        var border = sender as Border; // Cast to Border
        if (border != null)            // Check if the cast was right
        {
            var img = border.Child as Image;  // Cast to Image
            if (img != null)                  // Check if the cast was right
            {
                // your code
            }
            // else your Child isn't an Image her you could hast it to an other type
        }
        // else your Sender isn't an Border
    }

您也可以这样做。
    private void Image_MouseUp1(object sender, MouseButtonEventArgs e)
    {
        var border = sender as Border;
        if (border == null) // if the cast to Border failed
            return;         

        var img = border.Child as Image;
        if (img == null) // if the cast to Image failed
            return;

        // your code
    }

感谢您提供这篇文章,非常有助于学习回答问题的不同方法。 - user1189352
1
@user1189352 我还没完成,我会添加更多的解释 ;) - WiiMaxx
1
我曾经检查过空值,但这真的是正确的做法吗?如果发送者不是你所期望的,那么有人正在从不应该调用的地方调用事件。我不知道,只是在想。 - BrunoLM
@WiiMaxx - 那为什么不使用强类型,让TypeCastException自动抛出呢?同意BrunoLM的观点,在我们期望子类是Image的情况下,我们不应该放置这些安全检查。 - Rohit Vats
@RohitVats 以防他以后想要扩展代码并更加安全,避免“墨菲定律”。 - WiiMaxx
显示剩余2条评论

2

如果图像是边框的唯一和即时子级,您可以按照以下方式操作:

Image image = (Image)((Border)sender).Child;
image.Source = // Set image source here.

你又来了!如果这个能行,我就可以安心睡觉,明天在工作中度过愉快的一天。马上回来试试。 - user1189352
2
你让我非常开心,如果你在这里,我会亲吻你。我要去休息了,还有9分钟才能选择你作为正确答案。明天会给你信用。谢谢! - user1189352

2

或者您可以使用FindName


该方法可以帮助您在逻辑树中查找具有特定名称的元素。

(Image)(sender as Border).FindName("RedPick5_Image");

它将递归搜索 Border 的子元素,查找名为“RedPick5_Image”的元素。如果没有找到指定名称的元素,则可能返回null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接