Как заставить PanelDragDropTarget действовать только как цель, а не как источник? - PullRequest
2 голосов
/ 12 июля 2011

Я создал новое решение. Я добавил ссылку на System.Windows.Controls.Toolkit в свой проект Silverlight и написал следующий код:

XAML:

<UserControl x:Class="SilverlightApplication4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid>
        <toolkit:PanelDragDropTarget Margin="0,0,150,150" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" AllowedSourceEffects="Copy">
            <Grid Name="grid1" Background="Blue">
                    <Rectangle Height="40" HorizontalAlignment="Left" Margin="5,5,0,0" Name="rectangle1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="80" Fill="Red" />
                </Grid>
            </toolkit:PanelDragDropTarget>
        <toolkit:PanelDragDropTarget VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" Margin="150,150,0,0" AllowDrop="True" Drop="PanelDragDropTarget_Drop" AllowedSourceEffects="None">
            <Grid Name="grid2" Background="Green" />
        </toolkit:PanelDragDropTarget>
        </Grid>
    </Grid>
</UserControl>

C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication4
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void PanelDragDropTarget_Drop(object sender, Microsoft.Windows.DragEventArgs e)
        {
            Rectangle myRectangle = new Rectangle() { Margin = new Thickness(5,5,0,0), Height = 40, Width = 80, 
                    HorizontalAlignment = System.Windows.HorizontalAlignment.Left, VerticalAlignment = System.Windows.VerticalAlignment.Top,
                        StrokeThickness = 1, Stroke = new SolidColorBrush(Colors.Black), Fill = new SolidColorBrush(Colors.Red)};
            grid2.Children.Add(myRectangle);
        }
    }
}

Теперь, когда я перетаскиваю маленький красный прямоугольник из grid1 в grid2, все работает отлично. Но когда я касаюсь нового добавленного прямоугольника в grid2, он показывает видимые признаки того, что его можно перетаскивать. Мой вопрос заключается в том, как заставить второй PanelDragDropTarget (с сеткой 2 внутри) действовать только как цель для перетаскивания, а не как источник? Я имею в виду, как запретить пользователю перетаскивать новый созданный прямоугольник в grid2, то есть исключить любые видимые признаки того, что этот новый прямоугольник можно перетаскивать? Потому что в моем случае это не должно быть перетаскиваемым.

Ответы [ 2 ]

1 голос
/ 03 июля 2012

Вы пробовали AllowedSourceEffects = "None", у меня работает в SL5 ...

1 голос
/ 12 июля 2011

Я нашел решение.Для автора PanelDragDropTarget grid2 я определил обработчик события для его события ItemDragStarting.

    private void PanelDragDropTarget_ItemDragStarting(object sender, ItemDragEventArgs e)
    {
        e.Cancel = true;
        e.Handled = true;
    }

Теперь, когда я пытаюсь перетащить элементы в grid2, ничего не происходит (это было моей целью).

...