C# 在UWP中形成可拖动元素

C# 在UWP中形成可拖动元素,c#,xamarin,win-universal-app,xamarin.forms,C#,Xamarin,Win Universal App,Xamarin.forms,你好!我正在使用Xamarin.Forms开发一个仪表板视图 现在我想允许用户拖放我的图标来重新排列我的网格。但由于某些原因,我没有在UWP上看到拖动事件的可视表示。“DragStarted”事件是指。这是我的密码 这是我在UWP中的自定义渲染器 [assembly: ExportRenderer(typeof(DashboardIcon), typeof(DashboardIconRenderer))] namespace Paraply.Droid.Custom_Renderers { cl

你好!我正在使用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
        }
}
[程序集:导出渲染器(typeof(仪表板图标)、typeof(仪表板图标渲染器))]
命名空间Paraply.Droid.Custom_呈现器
{
类DashboardIconRenderer:视图渲染器
{
公用仪表板图标说明程序()
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(this==null)
返回;
this.CanDrag=true;
this.DragStarting+=OnDragStarting;
//this.Holding+=HandleHoldEvent;
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
this.CanDrag=true;
}
private void OnDragStarting(对象发送方,DragStartingEventArgs e)
{
//这火
}
}
Xamarin.Forms中的我的contentpage,或它的函数填充我的网格

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++;
    }
}
公共无效充气服务(IList服务)
{
整数计数=0;
serviceBoard.Children.Clear();
foreach(服务中的InstalledServiceModel服务)
{
DashboardIcon=新的DashboardIcon(service.Name、service.IconURL、service.Id);
var p=新的TapGestureRecognitor();
p、 CommandParameter=图标;
p、 SetBinding(TapGestureRecognizer.CommandProperty,“IconClick”);
图标。手势识别器。添加(p);
icon.Holding+=HandleHoldEvent;
serviceBoard.Children.Add(图标,计数%3,计数/3);
计数++;
}
}
现在,每个仪表板图标都是从网格派生的类

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);
    }
公共类仪表板图标:网格
{
//公共事件处理程序的举行;
//持有时公共无效(DashboardHoldingEventArgs e){持有(this,e);}
公共仪表板图标(字符串标题、字符串url、int id=-1)
{   
头衔=头衔;
URL=URL;
ServiceId=id;
/*
用户界面设计
*/
水平选项=LayoutOptions.FillAndExpand;
垂直选项=LayoutOptions.FillAndExpand;
添加(newRowDefinition(){Height=newGridLength(0.6,GridUnitType.Star)});
添加(newRowDefinition(){Height=newGridLength(0.4,GridUnitType.Star)});
图像=新图像()
{
Source=url,
水平选项=LayoutOptions.CenterAndExpand,
Aspect=Aspect.AspectFit
};
text=新标签()
{
文本=标题,
HorizontalTextAlignment=TextAlignment.Center,
TextColor=Color.Black
};
添加(图像,0,0);
添加(文本,0,1);
}

现在我的OnDragStarting函数启动得很好。但是由于某些原因,我没有看到我正在拖动的视图的可视表示,我希望视图跟随我的手指直到我将其放下?

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

检查,如果组件本身不适合您,这里提到的一些UWP可能会对您有所帮助。不确定使用自定义渲染器的UWP,但由于您提到使用的是Xamarin.Forms,您可以尝试使用cross p来实现这一点平台。这似乎不起作用。首先,我认为如果没有指定任何内容,默认元素将用作图像?下面是我在OnDragStarting
var bmpa=new Windows.UI.Xaml.Media.Imaging.BitmapImage(新Uri(This.BaseUri,“/Images/toggle_off.png”);e.DragUI.SetContentFromBitmapImage(bmpa);