2

我正在编写的应用程序中有一个侧边栏,它向用户显示有关应用程序状态的信息。在某些情况下,用户可以将鼠标悬停在侧边栏中的各种元素上以查看更具体的详细信息。这些细节使用模仿BootstrapPopover控件行为的控件显示给用户。我使用跨越整个窗口的不可见覆盖来完成此操作,并且“弹出框”本身使用计算和属性Canvas相对放置在此之上。CanvasCanvas.LeftCanvas.Top

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

这很好用,除了我想将此功能重构为单个控件。但是,我不确定如何继续 - 如果自定义在其 XAML 定义中UserControl包含Canvas覆盖,我将无法以与当前在应用程序中定位相同的方式定位控件的侧面板部分。但是,Canvas覆盖不能嵌套在侧面板内,因为它需要跨越整个窗口才能正常运行。

有没有办法定义一个UserControl可以位于逻辑树不同部分的单个?或者有没有更好的方法来实现这个效果?

4

1 回答 1

1

您不能将单个代码拆分UserControl到逻辑树中的不同位置,但您可以将其他代码注入到 a 中Control并将其放置在它定义的内部组件周围。这是由HeaderedContentControl: 两个内容属性Content和使用的模型Header,它们被注入到ContentPresenters控件模板中的两个不同的地方。因此,诸如控件内部部分周围多个位置的外部定义内容之Expander类的东西。TabItem在这种情况下,UserControl您会将它们放置在主 XAML 而不是模板中,因此绑定略有不同,但原理是相同的。

在您的对象上定义两个类型 object 的 Dependency 属性,UserControl然后将它们绑定到ContentPresenters您的示例中具有“大量各种嵌套元素”的确切位置。然后,当您使用时,您可以在标签内的元素UserControl下定义您想要的任何其他元素,它们将被放置在您的内容中。UserControl<MyUserControl.MyContentProperty1>UserControl

于 2013-07-09T21:10:30.513 回答