我正在使用WPF(C#)编写程序。我使用这样的方法来打开和关闭窗口:
public static void openCloseWindow(Window toBeOpen, Window toBeClose)
{
toBeOpen.Show();
makeWindowCenter(toBeOpen);
toBeClose.Close();
}
在程序的一部分中,我使用这样的方法:
openCloseWindow(new BestCustomerWindow,this);
因此可以在按钮上多次点击最终用户,并且可以打开许多窗口。
有没有办法避免在窗口运行时打开它?
了解更多信息:
让我点击打开window1的按钮。我想:
答案 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;
如果窗口已经打开,它将不会打开并发出警报声。