Xamarin Android IntentFilter 图片共享视图更新

问题描述

我正在尝试将信息从 MainActivity.cs 传递到视图,然后以某种方式将该视图的信息更新到该视图。在这种情况下,图像。问题是我无法从订阅的消息函数中更新视图。该函数确实遇到了断点,但不会更新 UI。

我向 MainActivity.cs 添加一个意图过滤器,并使用“Xamarin.Forms.Application.Current”通过 MessagingCenter 发送了图像流(是否有更好的方法/对象可以使用?)。

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this,savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this,savedInstanceState);
        LoadApplication(new App());
        if (Intent.Action == "android.intent.action.SEND")
        {

            var data = Intent.Data;
            Android.Net.Uri imageUri = (Android.Net.Uri)Intent.GetParcelableExtra(Android.Content.Intent.ExtraStream);
            var stream = ContentResolver.OpenInputStream(imageUri);
            MessagingCenter.Send(Xamarin.Forms.Application.Current,"ImageSent",stream);

        }
    }
    public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);

        base.OnRequestPermissionsResult(requestCode,grantResults);
    }
}

在我看来,我接受来自消息订阅的信息并有一个运行的功能。它确实遇到了一个断点。

public partial class AboutPage : ContentPage
{

    Aboutviewmodel _viewmodel;
    public AboutPage()
    {
        InitializeComponent();

        MessagingCenter.Instance.Subscribe<Application,Stream>(Application.Current,OnImageSent);

        BindingContext = _viewmodel = new Aboutviewmodel();
    }

    private void OnImageSent(Application source,Stream imagestream)
    {

        stack.Children.Add(new Image
        {

            Source = "xamarin_logo.png",VerticalOptions = Layoutoptions.Center
        });

    }
}

如果我在构造函数添加动态图像(我将图像硬编码到我知道在这个实例中存在的图像),它会添加它,但如果它在函数中运行则不会。我知道我应该使用 MVVM 等,但我想用最少的移动部件简单地让它工作,然后从那里开始。当我更新 BindingContext 对象时也存在问题。与运行的函数的上下文有关吗?

我也尝试过尝试在 Device.BeginInvokeOmMainThread 中添加图像的建议。但这也不起作用。

    private void OnImageSent(App source,Stream imagestream)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            stack.Children.Add(new Image
            {
                //HeightRequest = 64,Source = "xamarin_logo.png",VerticalOptions = Layoutoptions.Center
            });
        });
    }

或者我完全以错误的方式处理这个问题?我应该如何将我共享的图像发送到应用程序以供我查看?

解决方法

将 Stream 转换为 ImageSource 并尝试。

private void OnImageSent(Application source,Stream imageStream)
{
  var imageSource = ImageSource.FromStream(() => imageStream);
  stack.Children.Add(new Image
  {
   Source = imageSource,VerticalOptions = LayoutOptions.Center,WidthRequest = 100,HeightRequest = 100,}); ;
}

注意:- 我注意到,在调试模式下它不起作用。尝试通过从图库中选择一张照片并打开来启动应用程序。

如果不起作用,请告诉我。我会分享代码。

我只是想证明我可以使用图像从订阅更新 UI

是的,它可以使用图像。

我是否完全以错误的方式处理这个问题?我该如何得到我的 将图像共享到应用程序以供我查看?

使用 MessagingCenter 没问题。您也可以使用 Observer pattern