【问题标题】:UserControl that includes full window overlay包含完整窗口覆盖的用户控件
【发布时间】:2013-07-10 05:10:30
【问题描述】:

我正在编写的应用程序中有一个侧边栏,它向用户显示有关应用程序状态的信息。在某些情况下,用户可以将鼠标悬停在侧边栏中的各种元素上以查看更具体的详细信息。使用模仿Bootstrap's Popover control 行为的控件向用户显示这些详细信息。我使用跨越整个窗口的不可见 Canvas 覆盖来完成此操作,并且“弹出框”本身使用计算的 Canvas.LeftCanvas.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?或者有没有更好的方法来实现这个效果?

【问题讨论】:

  • 只是出于兴趣,您是否有理由不能使用现有的popup 控件?
  • @Benjamin 我对 WPF 还很陌生,几周前我实现这个弹出框效果时还不知道Popup 控件。如果我最终重写它,我肯定会使用Popup...这样会更容易使用,而且我可以完全避免这个问题。

标签: c# wpf user-controls


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多