Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > [WinRT] Drag and Drop между 2 Canvas элементов


Автор: Riccon 8.2.2014, 21:36
Добрый день.

Возникла задача иметь на одном экране несколько областей, на котолрых нужно свободным образом позиционировать некоторое количество объектов(Rectangle, например), а так же, передвигать эти объекты между областями.
В качестве таких областей выбрал Canvas. 

Если с DragAndDrop элементов внутри Canvas проблем нет, то как сдеать их перемещение между Canvas  я не представляю.
В принципе можно определить, что за Cancas находится под курсором, но, когда тянешь объект на другой Canvas, этот объект под него "заплывает".

Как быть, куда копать? 
Надеюсь, кто нибудь поможет с советом....



В качестве наброска:

Код

    <Grid Name="MainGrid" PointerMoved="Rectangle_PointerMoved" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Canvas Name="Canv0" Background="Gray" Grid.Column="0">
            <Rectangle                
                Width="80" 
                Height="80" 
                Fill="Red" 
                Canvas.Left="98" 
                Canvas.Top="102" 
                ManipulationDelta="Rectangle_ManipulationDelta"
                ManipulationMode="TranslateX , TranslateY" 
                ManipulationCompleted="Rectangle_ManipulationCompleted"
                />
        </Canvas>
        <Canvas Name="Canv1" Background="LightGray"  Grid.Column="1"></Canvas>
        <Canvas Name="Canv3" Background="LightBlue"  Grid.Column="2"></Canvas>
    </Grid>


Код

        private void Rectangle_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
        {
            Rectangle myRectangle = (Rectangle)sender;

            Canvas.SetLeft(myRectangle Canvas.GetLeft(myBorder) + e.Delta.Translation.X);
            Canvas.SetTop(myRectangle, Canvas.GetTop(myBorder) + e.Delta.Translation.Y);
        }

        private void Rectangle_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
        {
            Rectangle myRectangle = (Rectangle)sender;
            var position = myRectangle.TransformToVisual(Window.Current.Content).TransformPoint(new Point());
            var elements = VisualTreeHelper.FindElementsInHostCoordinates(position, MainGrid);
            foreach (UIElement element in elements)
            {
                if (element is Canvas)
                {
                    // code
                }
            }
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)