2013-07-09 81 views
2

我有一個應用程序,我寫的是顯示應用程序的狀態到用戶信息的側欄。在某些情況下,用戶可以將鼠標懸停在邊欄中的各種元素上以查看更多具體的細節。這些細節通過使用模仿Bootstrap's Popover control行爲的控件向用戶顯示。我使用跨越整個窗口的不可見Canvas覆蓋層來實現此目的,並且使用計算的Canvas.LeftCanvas.Top屬性將「Popover」本身相對放置在此Canvas上。用戶控件包含窗體完全覆蓋

這裏是一個(非常簡化的)看我的應用程序的當前XAML:

<Window> 
    <Grid x:Name="container"> 

    <.. a lot of various nested elements ..> 

     <StackPanel x:Name="sidepanel"> 
     .. content of the sidepanel control .. 
     </StackPanel> 

    </.. a lot of various nested elements ..> 

    <Canvas x:Name="overlay"> 
    .. content of the Popover control .. 
    </Canvas> 
    </Grid> 
</Window> 

這個偉大的工程,但我想重構這個功能集成到一個單一的控制。但是,我不知道如何繼續 - 如果自定義UserControl在其XAML定義中包含Canvas疊加層,我將無法以與當前定位在應用程序中相同的方式定位控件的側面板部分。然而,Canvas覆蓋不能嵌套側面板內,因爲它需要跨越整個窗口才能正常運行。

有沒有辦法定義一個UserControl可以坐在邏輯樹的不同部分?還是有更好的方法來實現這種效果?

+1

出於興趣,是否有一個原因,你不能使用現有的[彈出](http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup.aspx)控制? –

+0

@Benjamin我是相當新的WPF,並沒有瞭解'Popup'控制,當我在幾個星期前實現了這個酥料餅的效果。如果我最終重寫它,我肯定會使用'Popup' ...這樣做會更容易,我可以完全避免這個問題。 –

回答

1

不能拆單UserControl到邏輯樹不同的地方,但你可以注入其他代碼爲Control,並把它周圍定義了內部組件。這是HeaderedContentControl使用的模型:兩個內容屬性ContentHeader,它們被注入控件模板中的兩個不同的ContentPresenters。因此,諸如ExpanderTabItem之類的東西在控件的內部部分周圍的多個位置具有外部定義的內容。在UserControl的情況下,你將他們放置在主XAML,而不是一個模板,這樣的綁定稍有不同,但原理是一樣的。

在您UserControl定義類型的對象的兩個依賴屬性,然後結合到那些ContentPresenters放置在精確點,你必須「很多各種嵌套元素的」你的樣本。然後,當您使用UserControl時,您只需在UserControl元素內定義您想要的任何其他元素,例如<MyUserControl.MyContentProperty1>標籤,它們就會被放置在您的UserControl內容中。