2014-08-29 2 views
4

Есть ли способ управления, который позволяет мне зажимать и масштабировать, используя ТОЛЬКО Управление Xamarin.Forms.Xamarin.forms Pinch and Zoom

Я хочу отображать изображение в любом элементе управления из xamarin.forms (WebView или изображение или любое другое) и иметь возможность масштабирования из приложения.

ответ

1

Я закончил с использованием мета-просмотра, масштабирования следующим образом. Это может быть не решение для каждого, но это сработало для меня.

Поместите изображение hex -64 внутри тега изображения ниже, а затем поместите весь html в WebView.

this.WebView.Source = new HtmlWebViewSource { BaseUrl = URL, Html = html }; 

The html will be defined here. 
<!DOCTYPE html> 
<html lang="en-us"> 
<head> 
    <meta name="viewport" content="width=device-width, initial-scale=0.25, maximum-scale=3.0 user-scalable=1"> 
    <title></title> 
    <style> 
     body { 
      margin: 0 20px 0 0; 
      font-family: HelveticaNeue-Light, HelveticaNeue-UltraLight, Helvetica, Consolas, 'Courier New'; 
     } 

     table { 
      width: 100%; 
      border: 1px outset; 
      border-color: #3c4142; 
     } 

     td { 
      font-size: 8px; 
     } 
    </style> 
</head> 
<body> 
    <img src="data:image/png;base64,YourBase64imagestringhere" style="width:100%" /> 
</body> 
</html> 
+0

Я хочу что-то вроде этого, но я не могу понять это src = "data: image/png; base64, YourBase64imagestringhere", как я могу добавить статическое изображение Вот ?? Мой путь к изображению «myproject.Images.test.jpg» –

+0

Сначала вам нужно изменить изображение на базовую строку 64, см. Ссылку ниже о том, как это сделать http://stackoverflow.com/questions/21325661/convert-image- путь к base64-строки. Затем вы вводите результат базы 64 (который является очень большой строкой) и поместите его в местозаполнитель, который является вашимBase64imagestringhere в моем коде. вы должны иметь способ передачи данных в html. В моем случае я использую виды Razor из nancy fx. –

1

Существует нет способа ущипнуть/масштабировать с помощью встроенных элементов управления Forms со времени этого сообщения. Для этого есть способ, но для этого вам нужно реализовать собственный рендерер.

Я достиг этого в приложении, которое я пишу, создавая класс, который наследуется от Xamarin.Forms.ContentView - PanGestureContainer, который имеет такие свойства, как количество точек касания min/max и событие для прослушивания.

В проекте iOS я создал собственный рендерер для своего представления, где рендер берет свойства из представления и подключает прослушиватели событий касания.

Кроме того, я сделал прикрепляемое свойство (aka Behavior), которое может быть применено к другим представлениям, и когда оно применяется, оно берет представление у его родителя, обертывает его внутри PanGestureRecognizer, а другое прикрепленное свойство действует как обертка слушателя событий таким же образом ,

Это полный хак, но покрывает недостающую функциональность, пока Xamarin не реализует его чисто


Update: теперь с примерами кода, серьезно урезаны, как это было бы слишком много, чтобы отправить, это должно дать вам идея о том, как достичь этого, а это решение для копирования и вставки. Если это похоже на слишком много, возможно, это так, я уверен, что есть лучшие способы, но это делает трюк, пока эта функция не запекается.

public abstract class BaseInteractiveGestureRecognizer : BindableObject, IInteractiveGestureRecognizer 
    { 
     public static readonly BindableProperty CommandProperty = BindableProperty.Create<BaseInteractiveGestureRecognizer, ICommand> ((b) => b.Command, null, BindingMode.OneWay, null, null, null, null); 

     public ICommand Command { 
      get { 
       return (ICommand)base.GetValue (BaseInteractiveGestureRecognizer.CommandProperty); 
      } 
      set { 
       base.SetValue (BaseInteractiveGestureRecognizer.CommandProperty, value); 
      } 
     } 

     public object CommandParameter {get;set;} // make bindable as above 

     public GestureState State { get;set;} // make bindable as above 

     public View SourceView{ get; set; } 

     public void Send() 
     { 
      if (Command != null && Command.CanExecute (this)) { 
       Command.Execute (this); 
      } 
     } 
    } 

public class PanGesture : BaseInteractiveGestureRecognizer 
{ 
    public uint MinTouches { get;set; } // make bindable 
    public uint MaxTouches { get;set; } // make bindable 
    // add whatever other properties you need here - starting point, end point, touch count, current touch points etc. 
} 

А потом в проекте IOS:

public abstract class BaseInteractiveGestureRenderer : BindableObject,IGestureCreator<UIView> 
    { 
     public abstract object Create (IInteractiveGestureRecognizer gesture, Element formsView, UIView nativeView); 

     public static GestureState FromUIGestureState (UIGestureRecognizerState state) 
     { 
      switch (state) { 
      case UIGestureRecognizerState.Possible: 
       return GestureState.Possible; 
      case UIGestureRecognizerState.Began: 
       return GestureState.Began; 
      case UIGestureRecognizerState.Changed: 
       return GestureState.Update; 
      case UIGestureRecognizerState.Ended: 
       return GestureState.Ended; 
      case UIGestureRecognizerState.Cancelled: 
       return GestureState.Cancelled; 
      case UIGestureRecognizerState.Failed: 
       return GestureState.Failed; 
      default: 
       return GestureState.Failed; 
      }  
     } 
    } 


using StatementsHere; 
[assembly: ExportGesture (typeof(PanGesture), typeof(PanGestureRenderer))] 
namespace YourNamespaceHere.iOS 
{ 
public class PanGestureRenderer : BaseInteractiveGestureRenderer 
{ 
    public PanGestureRenderer() : base() 
    { 
    } 

    #region IGestureCreator implementation 

    public override object Create (IInteractiveGestureRecognizer gesture, Element formsView, UIView nativeView) 
    { 
     PanGesture panGesture = gesture as PanGesture; 
     nativeView.UserInteractionEnabled = true; 

     UIPanGestureRecognizer panGestureRecognizer = null; 
     panGestureRecognizer = new UIPanGestureRecognizer (() => panGesture.Send()); 
    } 
} 
+0

Привет Sten Петров. Можете ли вы опубликовать псевдокод? –

+0

Вот оно, удачи :) –

+0

Sten Petrov Ваш ответ может быть полезным, но я должен использовать только Xamarin.Forms. –