【问题标题】:Event trigger (button) opening multiple instances of same window事件触发器(按钮)打开同一窗口的多个实例
【发布时间】:2011-11-26 17:57:38
【问题描述】:

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

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

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

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

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

Location 是一个自定义类,它打开一个带有 3 个列表框的窗口

谢谢,感谢任何帮助。 我在 C# 4.0 和 Visual Studio 2010 上使用 WPF 应用程序。

【问题讨论】:

  • 点击事件的代码是什么?
  • @Mark:它是当您双击 xaml 中的按钮时自动生成的代码。在“Branch.xaml.cs”文件中,按钮点击的代码如下: private void rbtn_Location_Click(object sender, RoutedEventArgs e) { Location location = new Location();位置.显示(); } Location 是一个自定义类,它打开一个带有 3 个列表框的窗口

标签: c# wpf button multiple-instances


【解决方案1】:

您可以在主窗口中创建一个字段,该字段包含对位置窗口的引用(如果有),在按钮单击处理程序中检查该字段是否为空,如果它创建一个新窗口并将其存储在该字段中,如果没有在字段中的窗口上调用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();
    }
}

【讨论】:

  • 感谢您提供的信息。我将如何创建对窗口的引用?我为初学者的问题道歉。您是否介意进一步解释一下,您的上述答案。谢谢。非常感谢。
  • @PaulEngels:你使用propertyfield,在上面的例子中我使用了一个字段。
  • @H.B. : 非常感谢。你刚刚为我节省了很多时间。我真诚地感谢它。
【解决方案2】:

Application.Current.Windows 集合包含当前 AppDomain 的所有窗口的引用。您可以在该集合中检查您的窗口,如果它找到了您的窗口,则为该窗口调用 Activate,否则为 创建新窗口。这会让你继续前进 -

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

【讨论】:

  • @RV1987:谢谢。这个 sn-p 的代码也可以工作。非常感谢。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多