Открыть pdf-файл, загруженный из mvc web api в xamarin.forms [duplicate]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo() и сохранить результаты в члене этого объекта после завершения асинхронного вызова.

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

3
задан Sonu 7 January 2015 в 14:33
поделиться

2 ответа

Android:

public void OpenPdf(string filePath)
{
    Android.Net.Uri uri = Android.Net.Uri.Parse("file:///" + filePath);
    Intent intent = new Intent(Intent.ActionView);
    intent.SetDataAndType(uri, "application/pdf");
    intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

    try
    {
        Xamarin.Forms.Forms.Context.StartActivity(intent);
    }
    catch (Exception)
    {
        Toast.MakeText(Xamarin.Forms.Forms.Context, "No Application Available to View PDF", ToastLength.Short).Show();
    }
}

iOS, немного сложнее и требует дополнительных классов:

public void OpenPDF(string filePath)
{
    FileInfo fi = new FileInfo(filePath);

    QLPreviewController previewController = new QLPreviewController();
    previewController.DataSource = new PDFPreviewControllerDataSource(fi.FullName, fi.Name);

    UINavigationController controller = FindNavigationController();
    if (controller != null)
        controller.PresentViewController(previewController, true, null);
}

private UINavigationController FindNavigationController()
{
    foreach (var window in UIApplication.SharedApplication.Windows)
    {
        if (window.RootViewController.NavigationController != null)
            return window.RootViewController.NavigationController;
        else
        {
            UINavigationController val = CheckSubs(window.RootViewController.ChildViewControllers);
            if (val != null)
                return val;
        }
    }

    return null;
}

private UINavigationController CheckSubs(UIViewController[] controllers)
{
    foreach (var controller in controllers)
    {
        if (controller.NavigationController != null)
            return controller.NavigationController;
        else
        {
            UINavigationController val = CheckSubs(controller.ChildViewControllers);
            if (val != null)
                return val;
        }
    }
    return null;
}

public class PDFItem : QLPreviewItem
{
    string title;
    string uri;

    public PDFItem(string title, string uri)
    {
        this.title = title;
        this.uri = uri;
    }

    public override string ItemTitle
    {
        get { return title; }
    }

    public override NSUrl ItemUrl
    {
        get { return NSUrl.FromFilename(uri); }
    }
}

public class PDFPreviewControllerDataSource : QLPreviewControllerDataSource
{
    string url = "";
    string filename = "";

    public PDFPreviewControllerDataSource(string url, string filename)
    {
        this.url = url;
        this.filename = filename;
    }

    public override QLPreviewItem GetPreviewItem(QLPreviewController controller, int index)
    {
        return new PDFItem(filename, url);
    }

    public override int PreviewItemCount(QLPreviewController controller)
    {
        return 1;
    }
}

Используйте службу зависимостей для их получения и вызова по мере необходимости, работает очень хорошо для меня. Классы PDFItem и PDFPreviewControllerDataSource из блога, который я не могу для жизни, помню имя, но это не моя работа. FindNavigationController может не понадобиться в вашем случае, это может быть так же просто, как:

UISharedApplication.KeyWindow.PresentViewController

Вы можете найти информацию здесь: https://forums.xamarin.com/discussion/25746 / как к открытой PDF-в-Xamarin форм

5
ответ дан Jeremy Thompson 25 August 2018 в 06:44
поделиться

Теперь есть рецепт, охватывающий это: https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf/

Изменить: К сожалению, в рецепте используются пользовательские рендереры. Это может быть полезно, если вы не можете заставить его работать без Custom Renderer.

3
ответ дан Kent.Green 25 August 2018 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: