首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将焦点赋予已创建的窗口,而不是创建新实例?

如何将焦点赋予已创建的窗口,而不是创建新实例?
EN

Stack Overflow用户
提问于 2012-01-09 16:15:20
回答 3查看 376关注 0票数 1

我找到了这么多关于如何防止Windows.Forms多实例的主题,但我仍然找不到如何防止WPF窗口的多实例。我会解释我的想法。我有一个WPF窗口。这个窗口有一个漂亮的自定义按钮。单击该按钮时,将打开新窗口。我的问题是,当我在同一个按钮上点击多次时,出现的窗口与我点击该按钮的次数一样多。如何防止这种情况发生?有没有可能仅仅打开一个新窗口来获得焦点呢?

EN

回答 3

Stack Overflow用户

发布于 2012-01-09 16:38:05

那么,在创建新的之前,您必须检查它是否已创建:

伪类代码(这里只有记事本)

代码语言:javascript
复制
private YourWindow wnd = null;

void OnButton_Click()
{
    if (wnd == null) wnd = new YourWindow();
    wnd.Show();
}
票数 2
EN

Stack Overflow用户

发布于 2012-01-09 16:36:46

我见过一些方法,这就是我使用的方法。它是用VB编写的,但是你应该能够把它转换成C#。也许还有更好的方法,但我不是WPF专家!

我将一个函数隐藏在一个模块中,如下所示

代码语言:javascript
复制
 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

然后,当我尝试打开一个表单时,代码如下所示

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-01-09 16:54:49

我倾向于使用两种方法。有时,我会按照PowerRoy的建议,将一个字段存储在应用程序的适当中心位置,该字段引用了窗口。如果该字段不为空,我将激活它,而不是创建一个新实例。

有时当有许多类型的窗口,但我只想要其中的一种时,我会使用一个公共基类的列表(也许是list )。每个创建的窗口都放在那里,每当我想要创建或切换到其中之一时,我都会按类型对其进行过滤,并检查是否有任何内容,如果有则切换到它。类似于:

代码语言:javascript
复制
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做的东西,那么它显然是不起作用的。我的强类型函数式编程背景告诉我,我宁愿使用一个很好的枚举来索引窗口,而不是字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8785480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档