我找到了这么多关于如何防止Windows.Forms多实例的主题,但我仍然找不到如何防止WPF窗口的多实例。我会解释我的想法。我有一个WPF窗口。这个窗口有一个漂亮的自定义按钮。单击该按钮时,将打开新窗口。我的问题是,当我在同一个按钮上点击多次时,出现的窗口与我点击该按钮的次数一样多。如何防止这种情况发生?有没有可能仅仅打开一个新窗口来获得焦点呢?
发布于 2012-01-09 16:38:05
那么,在创建新的之前,您必须检查它是否已创建:
伪类代码(这里只有记事本)
private YourWindow wnd = null;
void OnButton_Click()
{
if (wnd == null) wnd = new YourWindow();
wnd.Show();
}发布于 2012-01-09 16:36:46
我见过一些方法,这就是我使用的方法。它是用VB编写的,但是你应该能够把它转换成C#。也许还有更好的方法,但我不是WPF专家!
我将一个函数隐藏在一个模块中,如下所示
Public Class FormsCollection
Public Shared Forms As ArrayList = New ArrayList
End Class
Public Function Find_form(strForm_name As String)
For Each F In FormsCollection.Forms
If F.ToString = strForm_name Then
Find_form = F
Exit Function
End If
Next
Find_form = Nothing
End Function然后,当我尝试打开一个表单时,代码如下所示
Dim FormToOpen As FormToOpen
If IsNothing(Find_form("FormToOpen")) Then
FormToOpen = New FormToOpen
Else
FormToOpen = Find_form("FormToOpen ")
End If
With FormToOpen
.Owner = Me
.ShowDialog()
.Activate
End with发布于 2012-01-09 16:54:49
我倾向于使用两种方法。有时,我会按照PowerRoy的建议,将一个字段存储在应用程序的适当中心位置,该字段引用了窗口。如果该字段不为空,我将激活它,而不是创建一个新实例。
有时当有许多类型的窗口,但我只想要其中的一种时,我会使用一个公共基类的列表(也许是list )。每个创建的窗口都放在那里,每当我想要创建或切换到其中之一时,我都会按类型对其进行过滤,并检查是否有任何内容,如果有则切换到它。类似于:
List<Window> allWindows = new List<Window>();
// ... elsewhere I want to create a ShinyWindow
void ActivateShinyWindow()
{
var shiny = allWindows.OfType<ShinyWindow>().FirstOrDefault();
if (shiny == null)
{
shiny = new ShinyWindow();
allWindows.Add(shiny);
}
ActivateWindow(shiny);
}其中ActivateWindow()会做任何必要的事情来使它可见,并把它放在前面或其他什么地方。实际上,我做的最重要的事情是在一个选项卡式界面中,所以它都是由封闭的shell窗口运行的。
这有点像Kevin Ross的答案,只是我是按类型对集合进行索引的。如果你想要多个窗口是同一个类的实例,然后你想要更像Kevin做的东西,那么它显然是不起作用的。我的强类型函数式编程背景告诉我,我宁愿使用一个很好的枚举来索引窗口,而不是字符串。
https://stackoverflow.com/questions/8785480
复制相似问题