2つのウィンドウが主にAとBで開かれている場合、ウィンドウBで記述されたコードを使用してウィンドウAを閉じる方法。
4 に答える
最善の策は、作成ウィンドウを渡すウィンドウBにプロパティを作成することです。このようなもの。MainWindowという名前のウィンドウとWindow2という名前の2番目のウィンドウがあります。
メインウィンドウ
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Window2 secondForm;
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
secondForm = new Window2();
secondForm.setCreatingForm =this;
secondForm.Show();
}
}
}
Window2
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window2.xaml
/// </summary>
public partial class Window2 : Window
{
Window creatingForm;
public Window2()
{
InitializeComponent();
}
public Window setCreatingForm
{
get { return creatingForm; }
set { creatingForm = value; }
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (creatingForm != null)
creatingForm.Close();
}
}
}
コメントに応じて、別のフォームによって作成されたウィンドウを閉じるのは、作成されたフォームのCloseメソッドを呼び出すのと同じくらい簡単です。
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Window2 secondForm;
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (secondForm == null)
{
secondForm = new Window2();
secondForm.Show();
}
else
secondForm.Activate();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
if (secondForm != null)
{
secondForm.Close();
secondForm = new Window2();
//How ever you are passing information to the secondWindow
secondForm.Show();
}
}
}
}
これは、他のウィンドウから任意のウィンドウを閉じる方法です。ウィンドウに一意の識別子を与え、foreach ループでそれを検索するだけで、複数のインスタンスで動作するように変更できます。
public static class Helper
{
public static void CloseWindowOfWhichThereIsOnlyOne<T>()
{
Assembly currentAssembly = Assembly.GetExecutingAssembly();
foreach (Window w in Application.Current.Windows)
{
if (w.GetType().Assembly == currentAssembly && w is T)
{
w.Close();
break;
}
}
}
}
または、一意の識別子「fudge」を使用:
public static void CloseWIndowUsingIdentifier(string windowTag)
{
Assembly currentAssembly = Assembly.GetExecutingAssembly();
foreach (Window w in Application.Current.Windows)
{
if (w.GetType().Assembly == currentAssembly && w.Tag.Equals(windowTag))
{
w.Close();
break;
}
}
}
一意のタグを付ける以外に、ウィンドウをいじる必要がないため、提案されたソリューションよりもこれが気に入っています。私はこれを、物事がユニークではないというリスクのない小さなプロジェクトにのみ使用してきました.10〜12個のウィンドウを見失うことはありません!
他の提案された解決策は、オブジェクトへの参照が既にある場合は win.close() を呼び出すことができるため、少しばかげています (コメントする 50 カルマはありません)。
このような1つのパブリッククラスとメソッドを作成するのは非常に簡単です
class Helper
{
public static void CloseWindow(Window x)
{
Assembly currentAssembly = Assembly.GetExecutingAssembly();
// int count = Application.Current.Windows;
foreach (Window w in Application.Current.Windows)
{
//Form f = Application.OpenForms[i];
if (w.GetType().Assembly == currentAssembly && w==x)
{
w.Close();
}
}
}
}
このようにウィンドウを閉じたい場所からこの関数を呼び出します。
Helper.CloseWindow(win);//win is object of window which you want to close.
お役に立てれば。