2016-04-22 7 views
1

Hiiho! Я разрабатываю представление панели управления с помощью Xamarin.Forms.Xamarin.Forms перетаскиваемый элемент в UWP

Теперь я хочу разрешить пользователю перетаскивать мои значки, чтобы изменить мою сетку. Но по какой-то причине я не вижу визуального представления события перетаскивания в UWP. Событие «DragStarted» - это огонь. Вот мой код

Это мой собственный рендер в UWP.

[assembly: ExportRenderer(typeof(DashboardIcon), typeof(DashboardIconRenderer))] 
namespace Paraply.Droid.Custom_Renderers 
{ 
class DashboardIconRenderer : ViewRenderer<DashboardIcon, Windows.UI.Xaml.FrameworkElement> 
    { 

     public DashboardIconRenderer() 
     { 

     } 

     protected override void OnElementChanged(ElementChangedEventArgs<DashboardIcon> e) 
     { 
      base.OnElementChanged(e); 

      if (this == null) 
       return; 
      this.CanDrag = true; 
      this.DragStarting += OnDragStarting; 
      //this.Holding += HandleHoldEvent; 
     } 

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      base.OnElementPropertyChanged(sender, e); 

      this.CanDrag = true; 
     } 

     private void OnDragStarting(object sender, DragStartingEventArgs e) 
     { 
     //This fires 
     } 
} 

Мой contentpage в Xamarin.Forms, или сво Funciton, которая заполняет мою сетку

public void InflateServices(IList<InstalledServiceModel> services) 
{ 
    int count = 0; 
    serviceBoard.Children.Clear(); 
    foreach (InstalledServiceModel service in services) 
    { 
     DashboardIcon icon = new DashboardIcon(service.Name, service.IconURL, service.Id); 

     var p = new TapGestureRecognizer(); 
     p.CommandParameter = icon; 
     p.SetBinding(TapGestureRecognizer.CommandProperty, "IconClick"); 
     icon.GestureRecognizers.Add(p); 

     icon.Holding += HandleHoldEvent; 

     serviceBoard.Children.Add(icon, count % 3, count/3); 
     count++; 
    } 
} 

Теперь каждый DashboardIcon это класс, который является производным от Grid. Это выглядит так:

public class DashboardIcon : Grid 
{ 
    //public event EventHandler<DashboardHoldingEventArgs> Holding; 
    //public void OnHolding(DashboardHoldingEventArgs e) { Holding(this, e); } 


    public DashboardIcon(string title, string url, int id = -1) 
    { 
     Title = title; 
     URL = url; 
     ServiceId = id; 
     /* 
     UI design 
     */ 
     HorizontalOptions = LayoutOptions.FillAndExpand; 
     VerticalOptions = LayoutOptions.FillAndExpand; 

     RowDefinitions.Add(new RowDefinition() { Height = new GridLength(0.6, GridUnitType.Star) }); 
     RowDefinitions.Add(new RowDefinition() { Height = new GridLength(0.4, GridUnitType.Star) }); 

     image = new Image() 
     { 
      Source = url, 
      HorizontalOptions = LayoutOptions.CenterAndExpand, 
      Aspect = Aspect.AspectFit 
     }; 

     text = new Label() 
     { 
      Text = title, 
      HorizontalTextAlignment = TextAlignment.Center, 
      TextColor = Color.Black 
     }; 

     Children.Add(image, 0, 0); 
     Children.Add(text, 0, 1); 
    } 

Теперь моя функция OnDragStarting срабатывает нормально. Но по какой-то причине я не вижу визуального представления вида, которое я перетаскиваю, я ожидал, что представление будет следовать за моим пальцем, пока я его не убью?

+0

проверить http://www.mrgestures.com/, есть некоторые упоминания UWP, которые могут помочь вам, если сам компонент не работает для вас. –

+0

Не уверен в UWP с настраиваемым рендерером, но поскольку вы упомянули, что используете Xamarin.Forms, вы можете попытаться реализовать это с помощью кросс-платформенного [Rec Gesture Recognizer] (https://developer.xamarin.com/guides/xamarin- формы/пользовательский интерфейс/жесты/панорамирование /). –

ответ

1

В OnDragStarting вы можете установить, например, e.DragUI.SetContentFromBitmap(). Там вы можете указать, что хотите видеть при перетаскивании (возможно, изображение). Также здесь вы можете установить this.Opacity = 0.2;, чтобы он стал прозрачным или невидимым.

+0

Это, похоже, не работает. Во-первых, я думал, что элемент по умолчанию будет использоваться как образ, если ничего не указано? Вот код im, пытающийся в OnDragStarting 'var bmpa = new Windows.UI.Xaml.Media.Imaging.BitmapImage (новый Uri (this.BaseUri," /Images/toggle_off.png ")); e.DragUI.SetContentFromBitmapImage (bmpa); ' –

+0

Что вы получаете, почему он не работает? – Matt

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