Слой WPF Adorner за пределами окна

У меня есть окно WPF с элементом управления текстовым полем. У элемента управления есть украшение, которое становится видимым, когда текстовое поле находится в фокусе клавиатуры.

Как вы можете видеть на скриншоте ниже, украшение ограничено рамками окна. Как сделать так, чтобы отображался весь рекламный щит?

введите описание изображения здесь

Шаблон рекламного объявления:

<DataTemplate x:Key="ContextualInfoDataTemplate">
    <Border 
        Background="#E1E1E1" 
        CornerRadius="6"
        Margin="50,36,0,0">
        <Border.Effect>
            <DropShadowEffect/>
        </Border.Effect>
        <Grid Width="200" Margin="4,3,4,4">
            <TextBlock TextWrapping="Wrap" Text="OverridenAutomationId"/>
        </Grid>
    </Border>
</DataTemplate>

person David Ward    schedule 02.12.2015    source источник


Ответы (1)


Это невозможно. AdornerLayer ограничивается пределами AdornerDecoratorWindow есть один, если вы его не определили), поэтому просто невозможно выйти за пределы этого декоратора.

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

Вы также можете определить собственное всплывающее окно, если хотите, чтобы эффекты отображались на рабочем столе (например, тень, которую вы показываете). Это действительно было бы сложно, но выполнимо. Приложив много усилий, вы могли бы заставить его перемещаться и изменять размер вместе с вашим окном (таким образом, имитируя «украшение вне окна»), но это определенно не будет быстро или легко кодировать (хотя для обычного Popup вы могли бы просто подключите свои Window события SizeChanged и LocationChanged и двигайтесь соответственно)

person Jcl    schedule 08.12.2015
comment
Спасибо за это. Я начал подозревать, что это могло быть так. В предыдущей попытке я пробовал использовать всплывающее окно, однако, что мне понравилось в подходе с декоративным слоем, так это то, что он перемещался вместе с элементом управления / окном. - person David Ward; 08.12.2015
comment
Вы можете перехватить _1 _ / _ 2_ события окна (учитывая, что фактическое текстовое поле, надеюсь, не перемещается!) И соответственно переместите Popup. Это не должно быть так сложно! :-) - person Jcl; 08.12.2015
comment
Взгляните на PopupEx в этой библиотеке. Это решает проблемы, связанные с перемещением / калибровкой. github.com/ControlzEx/ControlzEx - person James Willock; 08.12.2015
comment
@JamesWillock В наши дни я не занимаюсь WPF, но это определенно выглядит полезным. Я помню, как делал всевозможные хаки, чтобы это работало идеально- :-) - person Jcl; 08.12.2015
comment
Для справки я использовал всплывающее окно, как было предложено - person David Ward; 18.12.2015
comment
Я приземлился здесь после того, как реализовал Adorner WPF для перетаскивания и понял, что он не подходит для перетаскивания между Window или даже ListView из-за проблемы, описанной выше. Я также закончил тем, что построил свое собственное окно и отследил местоположение - и это было не так уж и безумно: мне потребовалось меньше, чем читать и выяснять якобы предпочтительный подход MS. - person mike; 31.12.2019