Создание элемента управления WPF с ручкой перетаскивания - PullRequest
0 голосов
/ 15 декабря 2011

Я работаю над визуализатором данных WPF, который позволяет перетаскивать таблицы SQL из проводника схемы (TreeView) на Canvas, а затем связывать ассоциации между таблицами.Элемент управления Table определен в XAML примерно так:

<UserControl>
    <Border Thickness="2">
        <DockPanel LastChildFill="True">
            <TextBlock DockPanel.Dock="Top" Text="{Binding TableName}" />
            <ListBox ItemsSource="{Binding Columns}" />
        </DockPanel>
    </Border>
</UserControl>

Я хочу добиться того, чтобы пользователь мог щелкнуть по TextBlock, который будет содержать имя таблицы, и перетащить элемент управления вокругна холсте, чтобы изменить его положение.Теперь есть множество из примеров о том, как реализовать перетаскивание, когда весь элемент управления является ручкой перетаскивания, но я хочу ограничить ручкув TextBlock (поскольку ListBox содержит список столбцов в таблице, и их можно перетаскивать в столбцы другой таблицы, чтобы определить ассоциации).

Кто-нибудь смог реализовать что-то подобное?

1 Ответ

0 голосов
/ 15 декабря 2011

Я реализовал нечто подобное некоторое время назад.

Все мои перетаскиваемые элементы управления унаследованы от одного базового элемента управления.Базовый элемент управления имел событие Loaded, которое проверяло бы VisualTree для FrameworkElement с именем PART_DragHandle, и, если оно находило, оно сообщало бы моему коду перетаскивания использовать этот элемент управления для инициирования перетаскивания.Если он не найдет его, он будет использовать весь элемент управления.

Код Drag / Drop, с которого я начал, взят из блога Беа Столльниц , хотя я немного его изменил.Я не помню, что включает в себя ее код, но у меня был собственный DependencyProperty для DragHandle, и я мог установить его, используя что-то вроде этого:

void UserControl_Loaded(object sender, EventArgs e)
{
    DependencyObject control = sender as DependencyObject;
    if (control == null) return;

    var dragHandle = VisualTreeHelpers.FindChild<FrameworkElement>(
        control, "PART_DragHandle");

    if (dragHandle != null)
        this.dragDropManager.SetDragHandle(dragHandle);
    else
        this.dragDropManager.SetDragHandle(control);
}

Чтобы перемещаться по VisualTree и находить мой дескриптор перетаскивания, я использовал нескольковспомогательные классы, которые я выложил здесь .

...