2015-12-02 72 views
15

我有一個WPF窗口與文本框控件。該控件有一個裝飾物,當文本框具有鍵盤焦點時,該裝飾物變得可見。WPF Adorner Layer Outside Window

正如您在下面的屏幕截圖中所看到的,裝飾者限於窗口的邊界。我怎樣才能讓整個裝飾者顯示出來?

enter image description here

裝飾器模板是:

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

回答

4

這是不可能的。 AdornerLayer限制在AdornerDecorator的範圍內(如果你還沒有定義一個,Window就有一個),所以它不可能超出那個裝飾器的範圍。

你可以使用PopupMSDN)得到你想要的,它定義了一個彈出窗口,但絕對不使用裝飾者。主要區別在於彈出窗口不是窗口的可視化樹的一部分,所以它不會隨着它移動或調整大小。

如果您想要通過桌面的效果(例如您顯示的投影),您也可以定義自己的彈出窗口。這確實很棘手,但可行。通過大量的工作,你可以使它隨着你的窗口移動和調整大小(從而模仿一個「窗外裝飾者」),但這絕對不是快速或容易編碼的(對於正常的Popup,儘管如此,你可以只需掛上您的WindowSizeChangedLocationChanged事件並相應地移動)

+0

感謝您的支持。我開始懷疑這可能是這種情況。在之前的嘗試中,我嘗試過使用Popup,但是我喜歡adorner層的方法是,它確實隨控件/窗口一起移動。 –

+1

你可以鉤住窗口的'SizeChanged' /'LocationChanged'事件(考慮到實際的文本框有希望不動!)並相應地移動'Popup'。這應該不是那麼難! :-) – Jcl

+1

看看這個lib中的PopupEx。它解決了有關移動/調整大小的問題。 https://github.com/ControlzEx/ControlzEx –