UserControl包括完整窗口覆盖

时间:2013-07-09 20:35:15

标签: c# wpf user-controls

我正在编写的应用程序中有一个侧边栏,它向用户显示有关应用程序状态的信息。在某些情况下,用户可以将鼠标悬停在侧边栏中的各种元素上以查看更具体的详细信息。使用模仿Bootstrap's Popover control行为的控件向用户显示这些详细信息。我使用跨越整个窗口的不可见Canvas叠加层完成此操作,并使用计算的CanvasCanvas.Left属性将“Popover”本身放置在此Canvas.Top上。 / p>

这是我的应用程序当前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 个答案:

答案 0 :(得分:1)

您不能将单个UserControl拆分到逻辑树中的不同位置,但您可以将其他代码注入Control并将其放在它定义的内部组件周围。这是HeaderedContentControl使用的模型:两个内容属性ContentHeader,它们被注入控件模板中的两个不同ContentPresenters。因此,ExpanderTabItem之类的内容在控件的内部部分周围的多个位置具有外部定义的内容。在UserControl的情况下,您将它们放在主XAML而不是模板中,因此绑定有点不同但原理是相同的。

UserControl上定义object类型的两个Dependency属性,然后将它们绑定到ContentPresenters中,放置在样本中有“很多不同嵌套元素”的确切位置。然后,当您使用UserControl时,您可以在UserControl元素内的<MyUserControl.MyContentProperty1>元素内定义您想要的任何其他元素,并将它们放在您的UserControl内容中。