4

WPF(C#)を使ってプログラムを書いています。ウィンドウを開閉するには、次のような方法を使用します。

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

    makeWindowCenter(toBeOpen);

    toBeClose.Close();
}

プログラムの一部で、このメソッドを次のように使用します。

openCloseWindow(new BestCustomerWindow,this);

そのため、エンドユーザーがボタンを数回クリックすると、多くのウィンドウが開く可能性があります。

実行中にウィンドウを開かないようにする方法はありますか?

詳細については:

開いているwindow1のボタンをクリックしてみましょう。したい:

  • window1 が閉じている場合は開きます。
  • それ以外の場合、window1 が開いている場合は、window1 にフォーカスします。
4

5 に答える 5

12

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();
}
于 2013-08-15T02:44:14.683 に答える
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);
        }
    }
}
于 2013-08-15T02:49:30.870 に答える