事件触发器(按钮)打开同一窗口的多个实例

时间:2011-11-26 17:57:39

标签: c# wpf button multiple-instances

在我的WPF应用程序中,我有一个主窗口(Branch.xaml),它有一个按钮,可以打开另一个窗口(Location.xaml)。打开此“位置”窗口后,当用户再次单击同一按钮时,如何阻止此“位置”窗口的另一个实例打开?

或者当用户再次点击按钮时,如何重新聚焦同一个打开的窗口?

当您双击xaml中的按钮时,按钮单击代码是自动生成的代码。

在“Branch.xaml.cs”文件中,按钮点击的代码如下:

private void rbtn_Location_Click(object sender, RoutedEventArgs e) 
{ 
    Location location = new Location(); 
    location.Show(); 
} 

位置是一个自定义类,它打开一个包含3个列表框的窗口

谢谢,任何帮助表示赞赏。 我在C#4.0&amp ;;上使用WPF应用程序Visual Studio 2010。

2 个答案:

答案 0 :(得分:0)

您可以在主窗口中创建一个字段,其中包含对位置窗口的引用(如果有),在按钮单击处理程序中检查该字段是否为空以及是否创建新窗口并将其存储在字段中,如果没有在字段中的窗口上调用Activate。当位置窗口消失时,您还必须订阅位置窗口的Closed事件以再次清除引用。

编辑:具体示例:

private LocationWindow locationWindow;
private void Button1_Click(object sender, RoutedEventArgs e)
{
    if (locationWindow == null)
    {
        locationWindow = new LocationWindow();
        locationWindow.Closed += (s, _) => locationWindow = null;
        locationWindow.Show();
    }
    else
    {
        locationWindow.Activate();
    }
}

答案 1 :(得分:0)

Application.Current.Windows 集合保留当前 AppDomain 的所有窗口的引用。您可以检查该集合中的窗口,如果它找到了您的窗口,则为该窗口调用激活,否则创建新窗口。这会让你去 -

private void rbtn_Location_Click(object sender, RoutedEventArgs e) 
{ 
    Window window = Application.Current.Windows.OfType<Window>().Where(win => win.Name == "LocationWindow").FirstOrDefault();
    if(window == null)
    {
       Location location = new Location(); 
       location.Show(); 
    }
    else
    {
       window.Activate();  
    }
} 

确保为您的窗口提供x:Name作为LocationWindow以使其正常工作。

<Window x:Name="LocationWindow">
</Window>

还在后面的代码中包含名称空间System.Linq