c# - 包含全窗口覆盖的用户控件

标签 c# wpf user-controls

我正在编写的应用程序中有一个边栏,用于向用户显示有关应用程序状态的信息。在某些情况下,用户可以将鼠标悬停在侧边栏中的各种元素上以查看更具体的详细信息。这些详细信息使用模仿 Bootstrap's Popover control 行为的控件向用户显示。 .我使用不可见的 Canvas 完成此操作覆盖整个窗口,“Popover”本身相对放置在这个 Canvas 上使用计算 Canvas.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>

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

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

最佳答案

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

在您的 UserControl 上定义两个对象类型的依赖属性然后将它们绑定(bind)到 ContentPresenters放置在样本中具有“许多不同嵌套元素”的确切位置。然后当你使用 UserControl您可以在 UserControl 下定义您想要的任何其他元素。里面的元素像<MyUserControl.MyContentProperty1>标签,它们将被放置在您的 UserControl 中内容。

关于c# - 包含全窗口覆盖的用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557713/

相关文章:

c# - 使用正则表达式从 AssemblyInfo.cs 文件中检索程序集版本

c# - 接收消息队列消息而不从接收队列中读取它们?

c# - 中文本地化支持

c# - Winform 和用户控制 - C#

c# - 类型不包含 'Round'和 'Parse'的定义

c# - 如何将图标(位图)转换为ImageSource?

wpf - 当我按“开始”时,Visual Studio 2012 不会启动应用程序

WPF 用户控件样式

c# - XAML 编辑器一直显示 : The member is not recognized or is not accessible

VB6 UserControls : Differences between OCX vs. 包括在项目中