将鼠标悬停在“测试”一词上时,将出现一个面板。当光标在面板上(黄色区域)时,面板可见。一切都很好。但是,当我将鼠标悬停在面板的元素(“单词”和按钮)上时,该面板是隐藏的。但是,我不希望这样。当我将光标移出面板区域时,我希望面板隐藏。问题:我该怎么做?非常感谢
Add-Type -Assembly System.Windows.Forms
$Main = New-Object System.Windows.Forms.Form
$Main.Width = 300
$Main.Height = 200
$Main.BackColor = '255, 255, 255'
$Main.StartPosition = 'CenterParent'
$Test = New-Object System.Windows.Forms.Label
$Test.Left = 10
$Test.Top = 10
$Test.Text = 'Test'
$Test.Add_MouseHover({ $Panel.Show() })
$Panel = New-Object System.Windows.Forms.Panel
$Panel.Left = 0
$Panel.Top = 10
$Panel.Width = 200
$Panel.Height = 100
$Panel.BackColor = '255, 255, 0'
$Panel.Hide()
$Panel.Add_MouseLeave({ $Panel.Hide() })
$Word = New-Object System.Windows.Forms.Label
$Word.Left = 80
$Word.Top = 20
$Word.Text = 'Word'
$Button = New-Object System.Windows.Forms.Button
$Button.Left = 50
$Button.Top = 50
$Button.Width = 100
$Button.Height = 30
$Main.Controls.Add($Panel)
$Main.Controls.Add($Test)
$Panel.Controls.Add($Word)
$Panel.Controls.Add($Button)
$Main.ShowDialog()
答案 0 :(得分:3)
该事件在离开面板时触发,当您将鼠标悬停在标签/按钮上时也会发生。
无论如何,这就是我的工作方式:
$Panel.Add_MouseLeave({
$point = [System.drawing.Point]::new([System.Windows.Forms.Cursor]::Position.X + 1,[System.Windows.Forms.Cursor]::Position.Y + 1)
if ($panel.width -lt $panel.PointToClient($point).X -or
$panel.height -lt $panel.PointToClient($point).Y){
$Panel.Hide()
}
})
请注意操纵光标位置(+1),否则它仍在面板中。
答案 1 :(得分:0)
发生这种情况是因为面板中的元素在面板之外。 因此,输入这两个中的任意一个都会触发...
$Panel.Add_MouseLeave({ $Panel.Hide() })
...代码。您可以通过注释掉该行并观察其行为来验证这一点。
您还有另一个问题,因为“ Test”一词也隐藏在面板中的悬停事件上,听起来也不像您想要的东西。
这不是PowerShell特定的问题。这是一个GUI设计问题,因为无论您是使用PowerShell还是其他使用此WinForms / WPF设计的编程语言,在GUI设计中都会发生这种情况。
一个快速而肮脏的解决方法是在表单上执行此操作。例如:
# $Panel.Add_MouseLeave({ $Panel.Hide() })
$Main.Add_MouseEnter({ $Panel.Hide() })
现在,以上并不是唯一的答案,但是,您应该真正转到Youtube,并观看一些Winforms / WPF GUI设计视频,以更好地了解该主题。然后,您可以稍后编织所需的PowerShell内容。