在我的WPF应用程序中,我想订阅一些事件/ callbeck /无论何时会在我的应用程序中打开(关闭)一个对话窗口时告诉我。WPF全局打开/关闭对话框事件?
我发现窗口集合,但,这是一个简单的容器,它似乎并没有提供订阅的任何手段。
我还用事件处理程序尝试,但似乎没有告诉我什么,我需要一个事件。
任何想法?
在我的WPF应用程序中,我想订阅一些事件/ callbeck /无论何时会在我的应用程序中打开(关闭)一个对话窗口时告诉我。WPF全局打开/关闭对话框事件?
我发现窗口集合,但,这是一个简单的容器,它似乎并没有提供订阅的任何手段。
我还用事件处理程序尝试,但似乎没有告诉我什么,我需要一个事件。
任何想法?
一个办法做到这一点没有一个基类增加一个处理程序主窗口停用
如果打开一个新的窗口,主窗口将失去焦点=你的“新窗口事件”
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);
}
我从未听说过任何全球开放/关闭事件。
应该以某种方式可以做的,但它提供的是你有超过打开的所有窗口和关闭控制。就像如果你建立一个“基本窗口”(它自然地继承了“窗口”),你所有的对话窗口都继承它。
然后你clould有“基本窗口”你从基本窗口的开启和关闭/关闭(或卸载)事件引发的静态事件,发送“这”作为“发件人”。 您可以在App.xaml.cs类中访问该静态事件。
这是一个黑客,但它是可能的。
没有创造所有的窗口,你可以连接到打开的事件基类(或手动添加打开的事件,每个窗口),我不知道你怎么能知道什么时候新的窗户创建。
可能有一种更优雅的方式,但您可以轮询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毫秒的延迟。
我担心这不是我的解决方案。有代码我不能改变,所以我不能使用每个对话框的公共基地。 – Silicomancer
请问,只有我自己的好奇心,你需要什么? –
基于自动GUI的软件测试。当然我也想控制对话框。 – Silicomancer