Drag & Drop-adorner в глубоко вложенных визуальных деревьях - PullRequest
0 голосов
/ 18 июня 2009

У нас есть приложение WPF, которое имеет настраиваемые окна на холсте, которые, в свою очередь, содержат настраиваемые элементы управления (основной холст, содержащий настраиваемые окна, снова представляет собой пользовательский элемент управления, отображающий материал). Итак, в основном визуальное дерево выглядит так (без неявных границ и прочего):

- Windows
  - Canvas
    - WindowMgr
      - CustomWindow (maximized with z-index 0, functioning as background)
        - ScrollPresenter
          - CustomControl1
      - CustomWindow
        - ScrollPresenter
          - CustomControl2

Теперь нам нужно перетаскивать эти пользовательские элементы управления друг на друга (обычно из подвижного окна в фоновое окно). Чтобы отобразить перетаскиваемый элемент оформления, необходимы украшенный элемент и слой элемента оформления. Обычно в примерах для этого используется их сетка или элементы управления, а также слой рекламного элемента из того же элемента.

То же самое здесь не работает, так как ScrollPreseneter / CustomWindows обрезают их содержимое, что предотвращает перетаскивание из окна. Пока мы идем по визуальному дереву, пока не найдем корневой холст и не используем его в качестве украшенного элемента, но это выглядит немного грязно (и, как мы поняли, не очень надежно).

Какие-нибудь предложения относительно надежного решения для этого?

1 Ответ

1 голос
/ 08 сентября 2009

Если я правильно прочитал ваш вопрос и, поскольку вы сами его не упомянули, возможно, вы ищете AdornerDecorator Class, который обеспечивает слой подкладки для элементов под ним в визуальном дереве .

Исходя из его названия, ScrollPresenter является производным от ContentPresenter, стоит отметить, что для реализации расширенных пользовательских элементов управления вы можете захотеть окружить их ContentPresenter AdornerDecorator, точно так же, как Window Class, см., например, Не забудьте AdornerDecorator для хорошего сценария реальной работы, включающего также перетаскивание.

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

 <ControlTemplate TargetType="{x:Type CustomWindow}">
     <Border ...>
         <Grid>
             <AdornerDecorator>
                 <ScrollPresenter ... />
             </AdornerDecorator>
         </Grid>
     </Border>
 </ControlTemplate>

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

См. Обзор украшателей для получения более подробной информации об архитектуре украшений.

...