C# 在UWP中形成可拖动元素
你好!我正在使用Xamarin.Forms开发一个仪表板视图 现在我想允许用户拖放我的图标来重新排列我的网格。但由于某些原因,我没有在UWP上看到拖动事件的可视表示。“DragStarted”事件是指。这是我的密码 这是我在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
[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来实现这一点平台。这似乎不起作用。首先,我认为如果没有指定任何内容,默认元素将用作图像?下面是我在OnDragStartingvar bmpa=new Windows.UI.Xaml.Media.Imaging.BitmapImage(新Uri(This.BaseUri,“/Images/toggle_off.png”);e.DragUI.SetContentFromBitmapImage(bmpa);