2009-06-18 5 views
0

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

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

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

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

Любые предложения по надежному решению для этого?

ответ

1

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

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

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

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

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

См. Adorners Overview для получения более подробной информации об архитектуре adorner.