包括完整窗口覆盖的UserControl
本文关键字:UserControl 覆盖 窗口 包括完 | 更新日期: 2023-09-27 18:21:47
我正在编写的应用程序中有一个侧边栏,它向用户显示有关应用程序状态的信息。在某些情况下,用户可以将鼠标悬停在侧边栏中的各种元素上,以查看更具体的细节。使用模仿Bootstrap的Popover
控件行为的控件向用户显示这些细节。我使用一个覆盖整个窗口的不可见的Canvas
覆盖来实现这一点,并且"Popover"本身使用计算的Canvas.Left
和Canvas.Top
属性相对放置在这个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
?或者有更好的方法来实现这种效果吗?
您不能将单个UserControl
拆分到逻辑树中的不同位置,但您可以将其他代码注入Control
,并将其放置在它定义的内部组件周围。这是HeaderedContentControl
使用的模型:两个内容属性Content
和Header
,它们被注入控件模板中的两个不同的ContentPresenters
中。因此,像Expander
和TabItem
这样的东西在控件的内部部分周围的多个位置具有外部定义的内容。在UserControl
的情况下,您将把它们放在主XAML中,而不是放在模板中,因此绑定有点不同,但原理是相同的。
在UserControl
上定义类型对象的两个Dependency属性,然后将它们绑定到ContentPresenters
中,放在样本中"有很多不同嵌套元素"的确切位置。然后,当您使用UserControl
时,您可以在里面的UserControl
元素下定义您想要的任何其他元素,比如<MyUserControl.MyContentProperty1>
标签,它们将被放置在UserControl
内容中。