WPF. DragAndDrop из разных панелей

257
27 февраля 2017, 10:40

Есть контрол:

<UserControl /*namespaces*/ 
            DataContext="{Binding RelativeSource={RelativeSource Self}}"
            AllowDrop="True">
    <Grid>
        <Image Source="{Binding Path=ImageUrl}" AllowDrop="True"></Image>
    </Grid>
</UserControl>

Главное окно, которое использует этот контрол:

<Window /*namespaces*/>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <ItemsControl Grid.Column="0" Name="ItemsControl">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
        <Grid Grid.Column="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="0.15*"></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <local:MyCustomControl Grid.Column="0" Grid.Row="1" Drop="MyCustomControl_Drop"></local:MyCustomControl>
        </Grid>
    </Grid>
</Window>

При старте приложения заполняется первая колонка топ-грида, то есть в первой колонке заполняется UniformGrid так:

ItemsControl.Items.Add(new MyCustomControl() { /* properties_initialization*/});

Во второй колонке топ-грида, создается ещё один внутренний грид (<Grid Grid.Column="1">)

Как видно из разметки во внутреннем гриде находится один мой контрол (в этот контрол нужно разрешить Drop):

<local:MyCustomControl Grid.Column="0" Grid.Row="1" Drop="MyCustomControl_Drop"></local:MyCustomControl>

Задача: из первой колонки топ-грида, взять item из UniformGrid и Drop-нуть во вторую колонку, во внутренний грид, в мой контрол <local:MyCustomControl...

Что получается сейчас: как видно из разметки контрола везде прописан атрибут AllowDrop="True" - который должен разрешать Drop. Но если перемещать элемент внутри UniformGrid то в нем везде Drop разрешен. А в момент когда <local:MyCustomControl> (из второй колонки) ещё не заполнен, Drop почему-то запрещен и можно дропнуть только на границу контрола..

Если дропать непосредственно на часть где изображение, то дроп тоже разрешен, но на момент старта там пусто, по этому приходится дропать только на границу..

Пробовал ко всем гридам дописывать AllowDrop="True" и описывать контрол так: <local:MyCustomControl AllowDrop="True" - без успешно.

Вопрос: почему так?

Answer 1

Судя по всему, у вас контрол не содержит установленного фона. Контрол без фона является «прозрачным» для событий от мыши, и таким образом не получает сообщения drag-and-drop.

Для того, чтобы контролу доставлялись мышиные события, ему нужен непустой Background. Для вашего случая — Background="Transparent".

READ ALSO
Unity не могу получить все json файлы из StreamAssets на Android

Unity не могу получить все json файлы из StreamAssets на Android

Пытаюсь получить все json файлы из папки StreamAssets на Android использую такой код

448
Вращение фигур в WPF

Вращение фигур в WPF

Есть у меня пятиконечная звезда

414
Гексагональная сетка

Гексагональная сетка

ВопросКак можно реализовать визуализацию гексагональной сетки на WPF, при том что каждая клеточка этой сетки является отдельным объектом,...

332
C# Наследование

C# Наследование

Решал задачу по наследованию на: http://skillsitvdn

293