XAML 避免同一窗口打开两次WPF

aurhwmvo  于 12个月前  发布在  其他
关注(0)|答案(6)|浏览(156)

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

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

    makeWindowCenter(toBeOpen);

    toBeClose.Close();
}

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

openCloseWindow(new BestCustomerWindow,this);


因此最终用户可以在按钮上点击几次,并且可以打开许多窗口。
有什么方法可以避免在运行时打开窗口吗?

  • 更多信息:*

让我点击一个按钮,这是打开窗口1。我想:

  • 如果窗口1已关闭,请将其打开。
  • 否则,如果窗口1已打开,则聚焦于窗口1。
jchrr9hc

jchrr9hc1#

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();
}

字符串

6kkfgxo0

6kkfgxo02#

阿巴德,
我认为你可以使用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);
        }
    }
}

字符串

yuvru6vn

yuvru6vn3#

这段代码将完全满足您的要求:
只需存储对话框对象并检查它是否已经在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;
    }

字符串
请注意这个问题已经在这里问过了

vc6uscn9

vc6uscn94#

我写了一个基于@ rand-towey answer的快速函数

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>();

js81xvg6

js81xvg65#

10年后,但希望对某人有用:

var winname = "MYWINDOW";

            //Validate
            bool iswinopen = false;

            foreach (Window w in Application.Current.Windows)
            {
                if (w.Name != winname) continue;

                iswinopen = true;
                w.Activate();

                break;
            }

            if (iswinopen) return;

            //Set
            var window = new Window() { Name = winname };

            window.ShowInTaskbar = true;
            window.Owner = Application.Current.MainWindow;
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.WindowState = WindowState.Normal;
            window.WindowStyle = WindowStyle.SingleBorderWindow;

            window.Content = new MyView() { DataContext = this }; //im use usercontrol as view with viewmodel here
            window.Show();

字符串

bf1o4zei

bf1o4zei6#

只是用

tobeopen.ShowDialog();

字符串
例如,我的窗口类名称是“Window 1”,使用“Window1.ShowDialog();”
如果Windows已经打开,它不会打开,它会发出警报声。

相关问题