【问题标题】:How to use z-index for label in powershell using System.Windows.Forms如何使用 System.Windows.Forms 在 Powershell 中使用 z-index 作为标签
【发布时间】:2021-09-24 05:50:49
【问题描述】:

我试图在 Powershell 脚本中将 System.Windows.Forms.Label 与另一个 Label 重叠。 到目前为止,我还没有在 Stackoverflow 内外找到任何可行的解决方案。 this thread 中使用透明度的解决方案也不适合我。

下面的 Powershell 脚本可以很好地展示我想要完成的工作。 应该在“嗨妈妈!”的顶部放置一个点。标签。目前,“Hi Mum!”标签部分覆盖了该点,尽管该点已被置于前面。

Add-Type -AssemblyName System.Windows.Forms

$FONT_WINGD = [System.Drawing.Font]::new("Microsoft Wingdings", 18)
$FONT_LARGE_BOLD = [System.Drawing.Font]::new("Microsoft Sans Serif", 18, [System.Drawing.FontStyle]::Bold)

$MyForm                     = New-Object System.Windows.Forms.Form
$MyForm.BackColor           = [System.Drawing.Color]::FromArgb(200,20, 20)


$MyLabel                    = New-Object system.Windows.Forms.Label
$MyLabel.Text               = "HI Mum !" 
$MyLabel.Font               = $FONT_LARGE_BOLD
$MyLabel.width              = 150
$MyLabel.height             = 24
$MyLabel.location           = New-Object System.Drawing.Point(40,20)
#$MyLabel.BackColor             = [System.Drawing.Color]::FromName("Transparent")
$MyLabel.BackColor          = [System.Drawing.Color]::FromName("Green")
$MyLabel.SendToBack()

$Dot                        = New-Object system.Windows.Forms.Label
$Dot.text                   = [System.Char]::ConvertFromUtf32(0x25CF);
$Dot.ForeColor              = [System.Drawing.Color]::FromArgb(155, 0, 79)
#$Dot.BackColor             = [System.Drawing.Color]::FromName("Transparent")
$Dot.BackColor          = [System.Drawing.Color]::FromName("Blue")
$Dot.width                  = 15
$Dot.height                 = 15
$Dot.location               = New-Object System.Drawing.Point(56,4)
$Dot.Font                   = $FONT_WINGD
$Dot.BringToFront()


$MyForm.controls.AddRange(@($MyLabel,$Dot))

$MyForm.ShowDialog()

【问题讨论】:

  • 太棒了minimal reproducible example,谢谢
  • 这真的很糟糕。我尝试单独添加它们,以不同的顺序调用 BringToFront()/SendToBack(),然后将它们放到表单上,分配 Z-Index - 没有任何效果。
  • 你有哪个 powershell 版本。我的是 5.1.19041.1023 桌面。构建 10.0.19041.1023。显然我们的两个版本的行为相似。
  • 名称值 ---- ----- PSVersion 5.1.14409.1018 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.14409.1018 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocol序列化版本 1.1.0.1
  • 我们还没有收到您的来信.. 任何给定的答案是否解决了您的问题?如果是这样,请通过单击左侧的 图标来考虑accepting。这将帮助其他有类似问题的人更轻松地找到它,并有助于激励其他人回答您将来可能遇到的任何问题。

标签: c# powershell


【解决方案1】:

将控件添加到父级后,将父级上的Controls 属性用于set the "child index"(z-index):

# ...
$MyForm.Controls.AddRange(@($MyLabel,$Dot))

$MyForm.Controls.SetChildIndex($MyLabel, 2)
$Dot.Controls.SetChildIndex($Dot, 1)

您可以创建一个简单的函数来解析父级并像这样设置索引:

function Set-WinFormControlZIndex
{
  param(
    [Parameter(Mandatory)]
    [System.Windows.Forms.Control]$Control,

    [int]$Index = -1
  )

  if($Control.Parent -is [System.Windows.Forms.Control]){
    $Control.Parent.Controls.SetChildIndex($Control, $Index)
  }
}

然后像这样使用:

# ...
$MyForm.Controls.AddRange(@($MyLabel,$Dot))

Set-WinFormControlZIndex $Dot 1
Set-WinFormControlZIndex $MyLabel 2

【讨论】:

  • 好的,但是结果看起来还是一样的。是powershell版本吗?
  • @ThomasWeller 您是否将$Dot 的索引设置为低于$MyLabel 的索引值?对我来说在 5.1 中工作得非常好
  • $Dot 得到 1,$MyLabel 2。我有 PowerShell 5.1.19041.1023
  • 当设置 childindex 时,我确实得到了 ` 使用“2”参数调用“SetChildIndex”的异常:` 翻译松散的细节;底层项目不是这个上层元素的底层控制元素。将$Dot.Controls.SetChildIndex($Dot, 1) 更改为$MyForm.Controls.SetChildIndex($Dot, 1) 后现在运行时不会出现异常。但结果对我来说是一样的。
【解决方案2】:

对我(也是 PowerShell 5.1)来说,这是可行的:

移动$MyLabel.SendToBack()$Dot.BringToFront() 之后将这些控件添加到表单:

$MyForm.Controls.AddRange(@($MyLabel,$Dot))
$MyLabel.SendToBack()
$Dot.BringToFront()

从您的代码中删除 $MyLabel.SendToBack()$Dot.BringToFront() 并执行

$MyForm.Controls.AddRange(@($MyLabel,$Dot))
$MyForm.Controls.SetChildIndex($Dot, 1)
$MyForm.Controls.SetChildIndex($MyLabel, 2)

上述方法有效,但缺少的代码是在包含点的标签上设置.TextAlign 属性。正因为如此,这个小标签尺寸中的点实际上被切断了。

要么将 $Dot.Width$Dot.Height 设置为更大的像素大小,以便点实际适合,要么这样做

$Dot.TextAlign = 'MiddleCenter'
# and after adding to the Forms Control collection, 
$MyForm.Controls.AddRange(@($MyLabel,$Dot))
$Dot.BringToFront()

(为了让图片更清晰,我将点字符设置为黄色,并将.Location设置为(58,8)

【讨论】:

  • 尝试了这两个选项,“点”仍然部分落后于 MyLabel。在我的问题中添加了示例屏幕截图。应用任何解决方案时都不会改变。
  • @pcvnes 请看我的编辑。它解释了代码 确实 工作,但由于点不适合标签,它只是看起来仍然在另一个标签后面..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多