Drag & Drop-украшение в глубоко вложенных визуальных деревьях

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

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

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

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

Есть предложения по надежному решению для этого?


person gix    schedule 18.06.2009    source источник


Ответы (1)


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

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

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

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

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

См. Обзор декоративных элементов для получения дополнительных сведений об архитектуре декоративных элементов.

person Steffen Opel    schedule 08.09.2009