C# WPF应用程序中的弹出窗口

C# WPF应用程序中的弹出窗口,c#,wpf,C#,Wpf,我有一个C#WPF应用程序,它在xaml(p屏幕)中使用网格控件。对于网格中的每一行,我都有一个名为“详细信息”的列。单击此列中的项将显示一个弹出窗口,该窗口在xaml(C屏幕)中也有一个网格。 P的viewmodel中的“我的项目单击”事件具有以下代码: var myChildWindow = new MyGridView(); myChildWindow.Show(); 如果用户多次单击该项目,我只想突出显示现有的C弹出窗口。如果没有打开的现有窗口,那么我只想打开一个新窗口 我曾为Winf

我有一个C#WPF应用程序,它在xaml(p屏幕)中使用网格控件。对于网格中的每一行,我都有一个名为“详细信息”的列。单击此列中的项将显示一个弹出窗口,该窗口在xaml(C屏幕)中也有一个网格。 P的viewmodel中的“我的项目单击”事件具有以下代码:

var myChildWindow = new MyGridView();
myChildWindow.Show();
如果用户多次单击该项目,我只想突出显示现有的C弹出窗口。如果没有打开的现有窗口,那么我只想打开一个新窗口

我曾为Winforms应用程序处理过类似的需求。对于WPF应用程序,我该如何处理


谢谢。

首先,您需要在click事件之外声明
myChildWindow
,以便可以从多个事件访问它。所以

MyGridView myChildWindow;
在click事件之外,可能作为私有变量

然后,在单击事件中查看它是否为空,如果为空,则创建它

if (myChildWindow == null)
{
    myChildWindow = new MyGridView();
    myChildWindow.Show();
}

您可以保留对窗口的引用,并在窗口关闭时删除该引用:

MyGridView  myChildWindow;
private void Button_Click(object sender, RoutedEventArgs e)
{
    if (myChildWindow == null)
    {
        myChildWindow = new MyGridView();
        myChildWindow.Closed += MyChildWindow_Closed;
        myChildWindow.Show();
    }
    else
    {
        myChildWindow.Activate();
    }
}

private void MyChildWindow_Closed(object sender, EventArgs e)
{
    myChildWindow.Closed -= MyChildWindow_Closed;
    myChildWindow = null;
}

这是一个没有代码隐藏的项目吗?谢谢Sach的回复。但使用这种方法,例如,如果第3行的弹出窗口已处于活动状态,并且如果我单击第5行弹出窗口,则不会打开新窗口,而是会高亮显示/激活现有窗口本身。在我的应用程序中,每一行都会向弹出窗口传递一些数据…因此每一行的弹出窗口都不同;有一个单独的窗口代表每一行。但我觉得你的设计有一个更大的问题。弹出窗口或任何形式/窗口都是显示信息的设备。因此,为每一行提供不同的窗口实例是相当大的冗余。你可能想重新考虑你的方法;有一个窗口,根据用户单击的行,向其显示适当的数据。