从发件人访问标记属性时出现Xamarin错误

本文关键字:Xamarin 错误 属性 访问 | 更新日期: 2023-09-27 18:29:54

我正试图通过处理程序中的sender对象访问按钮。然而,我一直得到这个例外:

指定的强制转换无效。

我知道这是一个简单的问题,但有人能帮我看看我缺了什么吗?它也不一定是标签,我只想知道点击了哪个按钮。

这是我得到异常的行:

var tag = ((UIButton)sender).Tag;

protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e)
    {
        try{
            //determine what was selected, video or image
            bool isImage = false;
            switch(e.Info [UIImagePickerController.MediaType].ToString()) {
            case "public.image":
                Console.WriteLine("Image selected");
                isImage = true;
                break;
            }
// if it was an image, get the other image info
            if(isImage) {
                // get the original image
                UIImage originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage;
                if(originalImage != null) {
                    // do something with the image
                    new Thread(new System.Threading.ThreadStart(() => {
                        Thread.Sleep(350);
                        BeginInvokeOnMainThread (() => {
                            var tag = ((UIButton)sender).Tag;
                            //UIButton senderButton = (UIButton)sender;
                            switch(tag)
                            {
                            case 0:
// do something here
                                break;
                            case 1:
// do something here                                    
break;
});
                    })).Start();
                }
            } 
            // dismiss the picker
            imagePicker.DismissModalViewController (true);
}catch(Exception ex)
        {
            ShowAlert ("Failed !", "Unable to select image", "");
            Console.WriteLine(ex.Message + ex.StackTrace);
        }
    }

从发件人访问标记属性时出现Xamarin错误

试试这样的东西:

UIButton button = sender as UIButton;
var tag = button.tag;

当"按钮"为空时,也可以添加一些检查,例如发件人不是UIButton

根据Jason上面的建议,UIImagePickerController是发送方,而不是启动选择器的按钮。这就是我解决问题的方法:

  1. 创建了一个全局标签变量

        int tag { get; set; }
    
  2. 在每个按钮的单击处理程序中分配标记值。例如:

    button.TouchUpInside += (object sender, EventArgs e) => {
                tag = 0;
                // Do other stuff here
            };
    
  3. 在switch语句中使用标记变量。