2015-12-02 9 views
15

Ich habe ein WPF-Fenster mit einem Textfeld Steuerelement. Das Steuerelement verfügt über einen Adorner, der sichtbar gemacht wird, wenn die Textbox über den Tastaturfokus verfügt.WPF Adorner Layer außerhalb des Fensters

Wie Sie auf dem Screenshot unten sehen können, ist der Adorner auf die Grenzen des Fensters beschränkt. Wie kann ich es so einrichten, dass der komplette Adorner angezeigt wird?

enter image description here

Adorner Vorlage:

<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> 

Antwort

4

es nicht möglich ist. Die AdornerLayer grenzt an die Grenzen einer AdornerDecorator (die Window hat eine, wenn Sie keine definiert haben), so dass es einfach nicht möglich ist, außerhalb der Grenzen dieses Dekorators zu gehen.

Sie können bekommen, was Sie wollen mit einem Popup (MSDN), die ein Popup-Fenster definiert, aber auf keinen Fall einen Adorner verwenden. Der Hauptunterschied besteht darin, dass das Popup nicht Teil des visuellen Baums des Fensters ist, so dass es sich nicht mit ihm bewegt oder seine Größe ändert.

Sie können auch ein eigenes Popup-Fenster definieren, wenn Sie Effekte möchten, die über den Desktop gehen (wie der angezeigte Schlagschatten). Das wäre in der Tat schwierig, aber machbar. Mit viel Arbeit können Sie es auch mit Ihrem Fenster verschieben und skalieren (also einem "out of window adorner" nacheifern), aber das wird bestimmt nicht schnell oder einfach zu programmieren sein (für einen normalen Popup), könnten Sie haken Sie einfach Ihre Window 's SizeChanged und LocationChanged Ereignisse und bewegen Sie sich entsprechend)

+0

Vielen Dank dafür. Ich vermutete, dass dies der Fall sein könnte. In einem früheren Versuch hatte ich versucht, das Popup zu benutzen, aber was ich an der adorner Schichtmethode mochte, war, dass es sich mit dem Control/Fenster bewegte. –

+1

Sie könnten die 'SizeChanged' /' LocationChanged' Events des Fensters (unter Berücksichtigung der tatsächlichen Textbox hoffentlich nicht bewegen!) Anhängen und das 'Popup' entsprechend verschieben. Das sollte nicht so schwer sein! :-) – Jcl

+1

Schau dir PopupEx in dieser lib an. Es löst Probleme bezüglich des Verschiebens/Sizings. https://github.com/ControlzEx/ControlzEx –