2012-12-15 89 views
0

在我的WPF应用程序中,我想订阅一些事件/ callbeck /无论何时会在我的应用程序中打开(关闭)一个对话窗口时告诉我。WPF全局打开/关闭对话框事件?

我发现窗口集合,但,这是一个简单的容器,它似乎并没有提供订阅的任何手段。

我还用事件处理程序尝试,但似乎没有告诉我什么,我需要一个事件。

任何想法?

回答

1

一个办法做到这一点没有一个基类增加一个处理程序主窗口停用

如果打开一个新的窗口,主窗口将失去焦点=你的“新窗口事件”

private readonly List<Window> openWindows = new List<Window>(); 

public void ApplicationMainWindow_Deactivated(object sender, EventArgs e) 
{ 
    foreach (Window window in Application.Current.Windows) 
    { 
     if (!openWindows.Contains(window) && window != sender) 
     { 
      // Your window code here 
      window.Closing += PopupWindow_Closing; 
      openWindows.Add(window); 
     } 
    } 
} 

private void PopupWindow_Closing(object sender, CancelEventArgs e) 
{ 
    var window = (Window)sender; 
    window.Closing -= PopupWindow_Closing; 
    openWindows.Remove(window); 
} 
0

我从未听说过任何全球开放/关闭事件。

应该以某种方式可以做的,但它提供的是你有超过打开的所有窗口和关闭控制。就像如果你建立一个“基本窗口”(它自然地继承了“窗口”),你所有的对话窗口都继承它。

然后你clould有“基本窗口”你从基本窗口的开启和关闭/关闭(或卸载)事件引发的静态事件,发送“这”作为“发件人”。 您可以在App.xaml.cs类中访问该静态事件。

这是一个黑客,但它是可能的。

+0

我担心这不是我的解决方案。有代码我不能改变,所以我不能使用每个对话框的公共基地。 – Silicomancer

+0

请问,只有我自己的好奇心,你需要什么? –

+0

基于自动GUI的软件测试。当然我也想控制对话框。 – Silicomancer

1

没有创造所有的窗口,你可以连接到打开的事件基类(或手动添加打开的事件,每个窗口),我不知道你怎么能知道什么时候新的窗户创建。

可能有一种更优雅的方式,但您可以轮询Application.Current.Windows以查看是否在创建新窗口的同时记录了您发现的窗口。

这里是一个最原始的例子,将演示如何使用DispatchTimer轮询新的窗口,跟踪发现窗户和钩到关闭事件。

代码隐藏

public partial class MainWindow : Window 
{ 
    private DispatcherTimer Timer { get; set; } 

    public ObservableCollection<Window> Windows { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     // add current Window so we don't add a hook into it 
     Windows = new ObservableCollection<Window> { this }; 

     Timer = new DispatcherTimer(DispatcherPriority.Background); 
     Timer.Interval = TimeSpan.FromMilliseconds(500); 
     Timer.Tick += (_, __) => FindNewWindows(); 
     Timer.Start(); 

     this.WindowListBox.ItemsSource = Windows; 
     this.WindowListBox.DisplayMemberPath = "Title"; 
    } 

    private void FindNewWindows() 
    { 
     foreach(Window window in Application.Current.Windows) 
     { 
      if(!Windows.Contains(window)) 
      { 
       window.Closed += OnWatchedWindowClosed; 
       // inserting at 0 so you can see it in the ListBox 
       Windows.Insert(0, window); 
       Feedback.Text = string.Format("New Window Found: {0}\r\n{1}", 
               window.Title, Feedback.Text); 
      } 
     } 
    } 

    private void OnWatchedWindowClosed(object sender, EventArgs e) 
    { 
     var window = (Window)sender; 
     Windows.Remove(window); 
     Feedback.Text = string.Format("Window Closed: {0}\r\n{1}", 
             window.Title, Feedback.Text); 
    } 

    private void CreateWindowButtonClick(object sender, RoutedEventArgs e) 
    { 
     string title = string.Format("New Window {0}", DateTime.Now); 
     var win = new Window 
        { 
          Title = title, 
          Width = 250, 
          Height = 250, 
          Content = title, 
        }; 

     win.Show(); 
     e.Handled = true; 
    } 
} 

XAML

<Grid> 
    <ListBox Name="WindowListBox" 
       Width="251" 
       Height="130" 
       Margin="12,12,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top" /> 
    <TextBox Name="Feedback" 
       Width="479" 
       Height="134" 
       Margin="12,148,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top" 
       VerticalScrollBarVisibility="Auto" /> 
    <Button Name="CreateWindowButton" 
      Width="222" 
      Height="130" 
      Margin="269,12,0,0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Click="CreateWindowButtonClick" 
      Content="Create New Window" 
      FontSize="20" /> 
</Grid> 

点击即可,只要你想创建许多新的窗口;然后关闭它们。你会看到反馈。当然,由于DispatchTimer的间隔设置为500毫秒,因此每当创建新窗口时都会有500毫秒的延迟。