【问题标题】:RadTileViewItem Drag/Drop in minimized stateRadTileViewItem 在最小化状态下拖放
【发布时间】:2013-03-05 10:35:04
【问题描述】:

我在我的项目中使用RadTileView,默认情况下Tile在恢复状态时启用拖放

,

但是当 1 个图块处于最大化状态而所有其他图块处于最小化状态时,我无法实现相同的功能

,

我认为 Telerik 没有在他们的 RadTileView 控件中提供此功能。实现这一目标的最佳方法是什么,或者是否可能?

【问题讨论】:

    标签: wpf drag-and-drop telerik tiles


    【解决方案1】:

    在搜索了不同的博客后,我才知道 Telerik Tile 开箱即用的视图中没有此功能,但他们已将其添加到他们的愿望清单中,您可以在这里投票http://www.telerik.com/support/pits.aspx#/public/silverlight/2449此功能@

    但是,作为一项工作,我已经为 RadTileView 实现了一个我自己的行为,它将完成所需的任务。

    public class RadTilesDragDropBehavior : Behavior<RadTileView>
    {
        private RadTileViewItem draggingTile { get; set; }
    
        public TileViewDragDropBehavior()
        {
            // Insert code required on object creation below this point.
        }
    
        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;
        }
        private void OnDragInitialize(object sender, DragInitializeEventArgs args)
        {
            var tileView = sender as RadTileView;
            var tileViewItem = args.OriginalSource as RadTileViewItem;
    
            Point pt = Util.CorrectGetPosition((RadTileView)sender);
            HitTestResult result = VisualTreeHelper.HitTest(AssociatedObject, pt);
            if (result != null)
            {
                DependencyObject obj = result.VisualHit.ParentOfType<RadFluidContentControl>();
                if (obj != null)
                {
                    //trying to drag from Tile content area, not allowed.
                    return;
                }
            }
    
            if (tileViewItem != null && tileView != null && tileView.MaximizedItem != null)
            {
                args.Data = tileViewItem;
                var draggingImage = new Image
                {
                    Source = new Telerik.Windows.Media.Imaging.RadBitmap(tileViewItem).Bitmap,
                    Width = tileViewItem.RestoredWidth,
                    Height = tileViewItem.RestoredHeight
                };
    
                if (tileView.MaximizedItem == tileViewItem)
                {
                    args.DragVisualOffset = new Point(args.RelativeStartPoint.X - 50, args.RelativeStartPoint.Y-55);
                }
                args.DragVisual = draggingImage;
                tileViewItem.Opacity = 0;
                args.AllowedEffects = DragDropEffects.Move;
                args.Handled = true;
                // keep a copy of dragging tile
                draggingTile = tileViewItem;
            }
        }
    
        private void OnDragAndDropCompleted(object sender, DragDropCompletedEventArgs args)
        {
            if (args.OriginalSource.GetType() == typeof(RadTileViewItem))
            {
                if (AssociatedObject.MaximizedItem != null)
                {
                    Point pt = Util.CorrectGetPosition((RadTileView)sender);
                    HitTestResult result = VisualTreeHelper.HitTest(AssociatedObject, pt);
                    if (result != null)
                    {
                        DependencyObject obj = result.VisualHit.ParentOfType<RadTileViewItem>();
                        if (obj != null)
                        {
                            ((RadTileViewItem)obj).Position = draggingTile.Position;
                            draggingTile.Opacity = 100;
                        }
                        else
                        {
                            draggingTile.Opacity = 100;
                        }
                    }
                    else
                    {
                        draggingTile.Opacity = 100;
                    }
                }
            }
        }
        private void MyTileView_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            FrameworkElement container = sender as FrameworkElement;
            if (AssociatedObject.MaximizedItem != null)
            {
                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;
        }
    
    }
    
    
    
    public static class Util
    {
        public static Point CorrectGetPosition(Visual relativeTo)
        {
            Win32Point w32Mouse = new Win32Point();
            GetCursorPos(ref w32Mouse);
            return relativeTo.PointFromScreen(new Point(w32Mouse.X, w32Mouse.Y));
        }
    
        [StructLayout(LayoutKind.Sequential)]
        internal struct Win32Point
        {
            public Int32 X;
            public Int32 Y;
        };
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetCursorPos(ref Win32Point pt);
    };
    

    XAML 会是这样的

    <telerik:RadTileView  x:Name="MyTileView" ItemsSource={Binding TileItems}>
                        <i:Interaction.Behaviors>
                            <behaviors:RadTilesDragDropBehavior/>
                        </i:Interaction.Behaviors>
    </telerik:RadTileView>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多