VB.NET应用调用ShowDialog时任务栏双实例的全局解决方法咨询
哥们,我之前也碰到过这个烦人的问题——用ShowDialog弹出对话框时,任务栏会多出一个独立的图标,明明主窗体已经处于不可操作状态,看着特别违和。你不想逐个修改对话框属性的思路完全正确,这里给你几个全局层面的解决方案,不用再为每个对话框单独配置:
方案一:创建全局对话框基类(最彻底的方案)
你可以创建一个所有对话框都继承的基类窗体,在基类里统一设置ShowInTaskbar = False,这样所有派生的对话框都会自动继承这个属性,一劳永逸。
代码示例:
Public Class BaseDialogForm Inherits Form Public Sub New() MyBase.New() ' 全局设置对话框不在任务栏显示 Me.ShowInTaskbar = False ' 也可以在这里统一设置其他对话框通用属性,比如FormBorderStyle等 End Sub End Class
使用方法:
把你所有的对话框窗体的继承对象从Form改成BaseDialogForm,比如:
' 原来的对话框定义 Public Class MyDialog Inherits Form ' 改成下面的 Inherits BaseDialogForm End Class
这个方案的好处是,任何新创建的对话框只要继承基类,就自动生效,不需要额外操作。
方案二:封装ShowDialog的扩展方法(适合已有项目改造)
如果你已经有很多对话框,不想修改它们的继承关系,可以给Form类写一个扩展方法,在调用对话框时自动设置ShowInTaskbar属性,替换原来的ShowDialog调用即可。
代码示例:
Imports System.Runtime.CompilerServices Module DialogExtensionMethods ' 带Owner参数的重载 <Extension()> Public Sub ShowDialogWithoutTaskbar(ByVal dialog As Form, ByVal owner As Form) dialog.ShowInTaskbar = False dialog.ShowDialog(owner) End Sub ' 不带Owner参数的重载,自动使用当前活动窗体作为Owner <Extension()> Public Sub ShowDialogWithoutTaskbar(ByVal dialog As Form) dialog.ShowInTaskbar = False dialog.ShowDialog(Form.ActiveForm) End Sub End Module
使用方法:
把原来的dialog.ShowDialog()或者dialog.ShowDialog(Me)替换成dialog.ShowDialogWithoutTaskbar()或者dialog.ShowDialogWithoutTaskbar(Me)就行,比如:
' 原来的调用 Dim myDialog As New MyDialog() myDialog.ShowDialog(Me) ' 修改后的调用 myDialog.ShowDialogWithoutTaskbar(Me)
这个方案不需要修改对话框本身的代码,只需要替换调用语句,适合已有项目快速改造。
额外说明:为什么会出现两个任务栏图标?
默认情况下,每个Form的ShowInTaskbar属性是True,当你用ShowDialog弹出对话框时,它会作为一个独立的顶级窗口存在,Windows会为它在任务栏创建一个单独的条目。而设置ShowInTaskbar = False或者给对话框指定Owner(让它依附于主窗体),都能让Windows不再为对话框单独显示任务栏图标。
如果选择指定Owner的方式,你也可以在扩展方法里加上dialog.Owner = owner,这样既保证对话框依附主窗体,也能避免任务栏多图标,效果和设置ShowInTaskbar类似。
内容的提问来源于stack exchange,提问作者Luke P

