避免两次打开WPF相同的窗口

时间:2013-08-14 23:51:34

标签: c# wpf xaml window

我正在使用WPF(C#)编写程序。我使用这样的方法来打开和关闭窗口:

public static void openCloseWindow(Window toBeOpen, Window toBeClose)
{
    toBeOpen.Show();

    makeWindowCenter(toBeOpen);

    toBeClose.Close();
}

在程序的一部分中,我使用这样的方法:

openCloseWindow(new BestCustomerWindow,this);

因此可以在按钮上多次点击最终用户,并且可以打开许多窗口。

有没有办法避免在窗口运行时打开它?

了解更多信息:

让我点击打开window1的按钮。我想:

  • 如果关闭window1,请将其打开。
  • 如果打开window1,则关注window1。

5 个答案:

答案 0 :(得分:11)

WINDOWNAME替换为所需窗口的名称:

bool isWindowOpen = false;

foreach (Window w in Application.Current.Windows)
{
    if (w is WINDOWNAME)
    {
        isWindowOpen = true;
        w.Activate();
    }
}

if (!isWindowOpen)
{
    WINDOWNAME newwindow = new WINDOWNAME();
    newwindow.Show();
}

答案 1 :(得分:1)

阿巴德,

我认为你可以使用Mutex,请参考下面的代码(在App.xaml.cs文件中):

public partial class App : Application
{
    [DllImport("user32", CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindow(string cls, string win);
    [DllImport("user32")]
    static extern IntPtr SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32")]
    static extern bool IsIconic(IntPtr hWnd);
    [DllImport("user32")]
    static extern bool OpenIcon(IntPtr hWnd);

    protected override void OnStartup(StartupEventArgs e)
    {
        bool isNew;
        var mutex = new Mutex(true, "My Singleton Instance", out isNew);
        if (!isNew)
        {
            ActivateOtherWindow();
            Shutdown();
        }
    }
    private static void ActivateOtherWindow()
    {
        var other = FindWindow(null, "MainWindow");
        if (other != IntPtr.Zero)
        {
            SetForegroundWindow(other);
            if (IsIconic(other))
                OpenIcon(other);
        }
    }
}

答案 2 :(得分:1)

此代码将完全符合您的要求:

只需存储对话框对象并检查它是否已在showWindow中创建。

使用windows Closed事件清除对话框对象的引用。

AddItemView dialog;

private void showWindow(object obj)
{

    if ( dialog == null )
    {
       dialog = new AddItemView();
       dialog.Show();
       dialog.Owner = this;
       dialog.Closed += new EventHandler(AddItemView_Closed);
    }
    else
       dialog.Activate();
}

void AddItemView_Closed(object sender, EventArgs e)
    {

        dialog = null;
    }

请注意,此问题已经提出here

答案 3 :(得分:0)

我基于@ rhys-towey答案写了一个快速功能

    void OpenNewOrRestoreWindow<T>() where T : Window, new()
    {
        bool isWindowOpen = false;

        foreach (Window w in Application.Current.Windows)
        {
            if (w is T)
            {
                isWindowOpen = true;
                w.Activate();
            }
        }

        if (!isWindowOpen)
        {
            T newwindow = new T();
            newwindow.Show();
        }
    }

用法OpenNewOrRestoreWindow<SomeWindow>();

答案 4 :(得分:-1)

只需使用

tobeopen.ShowDialog();    

示例我的窗口类名是&#34; Window1&#34;使用&#34; Window1.ShowDialog();&#34;

如果窗口已经打开,它将不会打开并发出警报声。