To make entire tile area draggable, I applied following behavior on RadTileView-
<telerik:RadTileView IsItemsAnimationEnabled="False" x:Name="myTileView"
ItemsSource="{Binding AvailableChartList,UpdateSourceTrigger=Explicit}"
telerik:RadTileView.ItemContainerStyle="{DynamicResource RadTileViewItemStyle1}"
MaximizeMode="Zero">
<i:Interaction.Behaviors>
<local:RadTilesDragDropBehavior/>
</i:Interaction.Behaviors>
</telerik:RadTileView>
-----Behavior------
public class RadTilesDragDropBehavior : Behavior<RadTileView>
{
private int DragedElementInitialPosition;
private bool isDragging;
private int endPosition = -1;
private RadTileViewItem dragElement;
protected override void OnAttached()
{
base.OnAttached();
// Insert code that you would want run when the Behavior is attached to an object.
DragDropManager.AddDragInitializeHandler(AssociatedObject, OnDragInitialize);
DragDropManager.AddDragDropCompletedHandler(AssociatedObject, OnDragAndDropCompleted);
AssociatedObject.PreviewDragOver += MyTileView_PreviewDragOver;
AssociatedObject.PreviewTilePositionChanged += RadTileView_PreviewTilePositionChanged;
}
private void RadTileView_PreviewTilePositionChanged(object sender, Telerik.Windows.RadRoutedEventArgs e)
{
if (this.isDragging)
{
e.Handled = true;
var container = e.OriginalSource as RadTileViewItem;
if (container == this.dragElement)
{
this.endPosition = container.Position;
}
}
}
private void OnDragInitialize(object sender, DragInitializeEventArgs args)
{
this.isDragging = true;
var tileView = sender as RadTileView;
var tileViewItem = args.OriginalSource as RadTileViewItem;
this.dragElement = tileViewItem;
this.DragedElementInitialPosition = dragElement.Position;
if (tileViewItem != null && tileView != null)
{
args.Data = tileViewItem;
var draggingItem = new RadTileViewItem
{
Style=AssociatedObject.Resources["RadTileViewItemStyle1"] as Style,
Width = tileViewItem.RestoredWidth,
Height = tileViewItem.RestoredHeight
};
args.DragVisual = draggingItem;
tileViewItem.Opacity = 100;
args.AllowedEffects = DragDropEffects.Move;
args.Handled = true;
}
}
private void OnDragAndDropCompleted(object sender, DragDropCompletedEventArgs args)
{
if (args.OriginalSource.GetType() == typeof(RadTileViewItem))
{
this.isDragging = false;
Point pt = Util.CorrectGetPosition((RadTileView)sender);
HitTestResult result = VisualTreeHelper.HitTest(AssociatedObject, pt);
if (result != null)
{
DependencyObject obj = result.VisualHit.ParentOfType<RadTileViewItem>();
if (obj != null)
{
endPosition=((RadTileViewItem)obj).Position;
RadTileView parent = args.Source as RadTileView;
IEnumerable<RadTileViewItem> itemsToMove = null;
if (this.endPosition != -1)
{
if (this.DragedElementInitialPosition < this.endPosition)
{
var itemsCollection = ((IList<ChartDetail>)parent.ItemsSource);
itemsToMove = itemsCollection
.Select(i => parent.ItemContainerGenerator.ContainerFromItem(i) as RadTileViewItem)
.Where(c => c.Position > this.DragedElementInitialPosition && c.Position <= this.endPosition)
.OrderBy(c => c.Position);
foreach (var item in itemsToMove)
{
item.Position--;
}
}
else
{
for (int i = 0; i < this.DragedElementInitialPosition - this.endPosition; i++)
{
this.dragElement.Position--;
}
}
}
this.endPosition = -1;
}
else
{
draggingTile.Opacity = 100;
}
}
else
{
draggingTile.Opacity = 100;
}
}
}
private void MyTileView_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
{
FrameworkElement container = sender as FrameworkElement;
if (container == null)
{
return;
}
double tolerance = 60;
double verticalPos = Util.CorrectGetPosition((RadTileView)container).Y;
double offset = 20;
ScrollViewer scrollViewer = AssociatedObject.FindChildByType<ScrollViewer>();
if (verticalPos < tolerance) // Top of visible list?
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - offset); //Scroll up.
}
else if (verticalPos > container.ActualHeight - tolerance) //Bottom of visible list?
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset); //Scroll down.
}
}
protected override void OnDetaching()
{
base.OnDetaching();
// Insert code that you would want run when the Behavior is removed from an object.
DragDropManager.RemoveDragInitializeHandler(AssociatedObject, OnDragInitialize);
DragDropManager.RemoveDragDropCompletedHandler(AssociatedObject, OnDragAndDropCompleted);
AssociatedObject.PreviewDragOver -= MyTileView_PreviewDragOver;
AssociatedObject.PreviewTilePositionChanged -= RadTileView_PreviewTilePositionChanged;
}
}
If I drag Tile By clicking anywhere on the tile and drop anywhere on the RadTileView, it works fine.
But If I try to drag the Tile by clicking on the header area(RadTileViewItem's default draggable area) and drop the tile out of RadTileView, Tile vanishes from the view. (Please refer the attached image to see the issue.)
Please, suggest a way to fix this issue or if there is any other way to make entire tile draggable.