Проблемы использования наследования с перетаскиванием в WPF - PullRequest
2 голосов
/ 10 января 2011

У меня есть пользовательский контроль, на котором я хочу реализовать интерфейс перетаскивания, вот важные части реализации, и это прекрасно работает:

XML-файл в usercontrol для перетаскивания:

<UserControl 
         ...default xmlns...
         MouseLeftButtonDown="Control_MouseLeftButtonDown">
         ...GUI-ELEMENTS in the control...
</UserControl>

Код:

public partial class DragableControl : UserControl
{
    private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
         DragDrop.DoDragDrop(this, this, DragDropEffects.Move);
    }
}

XML-файл для usercontrol, который сможет принять операцию перетаскивания:

<Usercontrol 
         ...default xmlns...>
    <Grid AllowDrop="True" Drop="Grid_Drop">
         ... GUI elements in the grid....
    </Grid> 
</Usercontrol>

Код:

public partial class DropClass: UserControl
{
    private void Grid_Drop(object sender, DragEventArgs e)
    {
        var control = (DragableControl)e.Data.GetData(typeof(DragableControl));
        if(control != null)
        {
            //do something
        }        
    }
}

Чтобы иметь возможность создавать различные пользовательские элементы управления с функцией перетаскивания, я создаю базовый класс BaseDragableUserControl, который на данный момент ничего не содержит, но наследует от usercontrol.

Код:

public class BaseDragableUserControl: UserControl
{
}

Я изменяю свой код (как xaml, так и код):

 public partial class DragableControl : UserControl

Я также изменяю класс для получения на:

public partial class DropClass: UserControl
{
    private void Grid_Drop(object sender, DragEventArgs e)
    {
        var control =(BaseDragableUserControl)e.Data.GetData(typeof(BaseDragableUserControl));
        if(control != null)
        {
            //do something
        }        
    }
}

Но переменная control всегда равна нулю. Я предполагаю, что getdata в DragEventsArgs не любит наследование. Есть ли способ добиться этого? Чтобы можно было использовать базовый класс для класса перетаскивания?

1 Ответ

5 голосов
/ 11 января 2011

Вместо передачи this при инициации перетаскивания создайте для этой цели один из стандартных контейнеров.В частности:

DragDrop.DoDragDrop(this, new DataObject("myFormat", this), DragDropEffects.Move);

, и теперь вы знаете, ожидаете определенного типа данных:

var control =(BaseDragableUserControl)e.Data.GetData("myFormat");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...