【问题标题】:Xamarin.Forms draggable element in UWPUWP 中的 Xamarin.Forms 可拖动元素
【发布时间】:2016-08-16 05:27:37
【问题描述】:

喂!我正在使用 Xamarin.Forms 开发仪表板视图。

现在我想允许用户拖放我的图标来重新排列我的网格。但由于某种原因,我在 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
        }
}

我在 Xamarin.Forms 中的内容页,或者它填充我的网格的功能

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 函数可以正常触发。但是由于某种原因,我没有得到我正在拖动的视图的视觉表示,我期待视图跟随我的手指直到我放下它?

【问题讨论】:

  • 查看mrgestures.com,如果组件本身不适合您,那里提到的一些 UWP 可能会对您有所帮助。
  • 不确定带有自定义渲染器的 UWP,但既然您提到您使用的是 Xamarin.Forms,您可以尝试使用跨平台 Pan Gesture Recognizer 来实现它。

标签: c# xamarin win-universal-app xamarin.forms


【解决方案1】:

例如,在OnDragStarting 中,您可以设置e.DragUI.SetContentFromBitmap()。您可以在此处指定拖动时想要看到的内容(可能是图像)。您也可以在这里设置this.Opacity = 0.2;,使其变得透明或不可见。

【讨论】:

  • 这似乎不起作用。首先,我认为如果没有指定默认元素将用作图像?这是我在 OnDragStarting var bmpa = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri(this.BaseUri, "/Images/toggle_off.png")); e.DragUI.SetContentFromBitmapImage(bmpa); 中尝试的代码
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多