Как сделать пользовательский WPF ContentControl, который поддерживает перетаскивание во время разработки? - PullRequest
3 голосов
/ 04 марта 2011

Я хочу создать пользовательский элемент управления WPF, в котором есть один дочерний элемент управления. Подклассы ContentControl или UserControl работают, но имеют один недостаток: эти элементы управления не работают в режиме конструктора.

Под "не работает" я подразумеваю такой сценарий: предположим, у меня есть Canvas с моим пользовательским элементом управления. Я хочу поставить, скажем, Button под свой контроль. Я перетаскиваю его из панели инструментов, и он появляется внутри моего элемента управления. Тем не менее, представление XAML показывает, что новая кнопка действительно принадлежит Canvas, а не моему контролю.

Я могу поместить его в свой элемент управления, вручную редактируя XAML, но я хочу, чтобы дизайнер тоже работал.

Интересно, что когда я подкласс Canvas, Grid или Panel, дизайнер работает, как ожидалось. Однако у этих элементов управления есть много детей, а это не то, что мне нужно.

Как сделать элемент управления для одного ребенка, который работает в конструкторе?

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

как насчет наследования от Border? таким образом вы можете избавить себя от хлопот с Designer Extensibility

1 голос
/ 23 мая 2017

У меня тоже был похожий вопрос здесь .

Но после того, как он копает и копает, кажется, что реальный ответ - "НЕТ" , нет никакого официального способа поддержать перетаскивание элементов управления прямо в пользовательский Контент-контроль во время разработки, даже реализация «HitTestCore», как подсказывает ответ Стефана, не включает перетаскивание во время разработки для ContentControl .

Для таких целей вам следует рассмотреть возможность наследования от Grid или Panel (для разрешения нескольких дочерних элементов управления) или от Border (для разрешения одного дочернего элемента).

0 голосов
/ 26 марта 2012

У меня была та же проблема с элементом управления контентом, который я пишу, и нашел простое решение по этому поток StackOverflow .

Просто реализуйте метод HitTestCore:

protected override System.Windows.Media.HitTestResult HitTestCore(System.Windows.Media.PointHitTestParameters hitTestParameters)
{
    return new PointHitTestResult(this, hitTestParameters.HitPoint);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...