2016-07-22 2 views
1

Im разрабатывает приложение, которое имеет несколько страниц контента из нашей CMS , которые должны быть отображены в WebView, так как они имеют HTML с некоторыми гиперссылка в немXamarin Форма ручка гиперссылка в WebView Navigating выпуске

Im контролирующих гиперссылка Wich работает, как ожидалось на андроид им делать это с Navigating события Xamarin.Forms.WebView

им возможность использовать e.Url отправить пользователя на внутреннюю страницу.

Пример:

public class HybridWebView : WebView 
{ 
    public String Code { get; set; } 

    public HybridWebView() 
    { 
     Navigating += HybridWebView_Navigating; 
    } 


    private void HybridWebView_Navigating(object sender, WebNavigatingEventArgs e) 
    { 
     if(e.Url.EndsWith(".aspx") 
     { 
      var CMS = new CMSView(e.Code, null); 
      Navigation.PushAsync(CMS); 
      e.Cancel = true; 
     } 
    } 
} 

Примечание это хорошо работает!

Проблема заключается в том:

, когда я попробовать это на прошивке я получил пустой/белый WebView. Я попытался сделать CustomRenderer на iOS, но так как я подклассифицировал WebView для его настройки, я не могу достичь свойств Code, например.

Как я могу достичь свойств в пользовательском рендерере для ios? Я знаю e.NewElement, но ShouldStartLoad ожидает UIWebView, а не мой пользовательский HybridWebView.

Есть ли у кого-нибудь какие-либо советы или идеи, как я могу это достичь.

Заранее спасибо

ответ

3

В видеообработки клиента (подкласс WebViewRenderer я предполагаю), вы можете бросить e.newElement к вашему типу HybridWebView, например:

HybridWebView wv = e.NewElement as HybridWebView; 

Тогда вы должны быть в состоянии получить доступ ваш Code объект с wv.Code.

Также NativeView Недвижимость WebViewRenderer предоставит вам iOS родной UIView для работы. Вы должны уметь отображать это в UIWebView без проблем. Например:

UIWebView nativeUIWebView = NativeView as UIWebView; 

Надеюсь, это поможет!

+0

Thnx jgoldberger Мне не нужно бросать e.NewElement, так как он знает его от типа гибридного изображения, но как я могу использовать ShouldStartLoad, он ожидает UIWebView в качестве параметра, и мне нужно использовать Hybridview там. –

+0

Если я что-то не хватает, NativeView, о котором я упоминал, должен быть тем, что создало базовый рендерер для вашего HybridWebView. Итак, это должен быть UIWebView для использования с ShouldStartLoad, если я не ошибаюсь? – jgoldberger

1

Если вы хотите использовать ShouldStartLoad, вам необходимо будет выполнить обычай UIWebViewDelegate для родного UIWebView. Это может оказаться сложным, потому что если вы замените существующего делегата на пользовательский, вы потеряете некоторые встроенные функции, которые предоставляет Xamarin.Forms WebView. Вот стратегия я использую, чтобы получить лучшее из обоих:

[assembly: ExportRenderer (typeof (WebView), typeof (CustomWebViewRenderer))] 
public class CustomWebViewRenderer : WebViewRenderer 
{ 
    protected override void OnElementChanged (VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged (e); 

     if (e.OldElement == null) { 

      // Need to capture the existing one so we don't loose functionality 
      // that Xamarin.Forms already has 
      var existingDelegate = Delegate; 

      // Make sure to pass the existing one to the new one 
      Delegate = new MyCustomWebViewDelegate(existingDelegate); 
     } 
    } 
} 

public class MyCustomWebViewDelegate : UIWebViewDelegate 
{ 
    readonly UIWebViewDelegate existingDelegate; 

    public MyCustomWebViewDelegate(UIWebViewDelegate existing) 
    { 
     existingDelegate = existing; 
    } 

    public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) 
    { 
     // You can customize this instead of returning the existingDelegate method 
     return existingDelegate.ShouldStartLoad(webView, request, navigationType); 
    } 

    public override void LoadFailed (UIWebView webView, NSError error) 
    { 
     existingDelegate.LoadFailed(webView, error); 
    } 


    public override void LoadingFinished (UIWebView webView) 
    { 
     existingDelegate.LoadingFinished(webView); 
    } 


    public override void LoadStarted (UIWebView webView) 
    { 
     existingDelegate.LoadStarted(webView); 
    } 

} 

Примечание * КСН, WebViewRenderer наследует непосредственно от UIWebView, так что вы не имеете работу свойство управления с. Вы являетесь прямым подклассом UIWebView и имеете доступ к свойствам, которые вы ожидаете. См. Источник here.

Вы можете добавить пользовательский логин к методу MyCustomWebViewDelegate.ShouldStartLoad.

Смежные вопросы