我有一個要求來追蹤WPF中的所有Window.Show
或ShowDialog()
。 主要目的是我想知道什麼時候所有Window in App打開或關閉。 類似的,當關閉WindowA或ChildWindowA時,我想要爲其打開/關閉的視圖編寫AuditLog,我不想爲每個Window或ChildWindow編寫代碼並將其寫入App實例級別以處理所有打開/關閉窗口或應用程序中的ChildWindow。如何查找應用程序中的所有Show或ShowDialog WPF
0
A
回答
0
您可以創建一個從Window
派生的基類來處理日誌記錄。
public class AuditLoggableWindow : Window
{
public AuditLoggableWindow()
{
Closing += OnClosing;
ContentRendered += OnShown;
}
protected void OnClosing(object o, CancelEventArgs e)
{
// log that window is closing now
}
protected void OnShown(object o, EventArgs e)
{
// log that the window has been shown
}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : AuditLoggableWindow
{
public MainWindow()
{
InitializeComponent();
}
}
而在XAML標記,你需要與namespace:AuditLoggableWindow
更換Window
標籤。由於我的項目的命名空間是wpfApplication1
,標記將如下所示:
<wpfApplication1:AuditLoggableWindow x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</wpfApplication1:AuditLoggableWindow>
0
我想註冊一個附加屬性:
public static class WindowLog
{
public static readonly DependencyProperty EnableLogProperty =
DependencyProperty.RegisterAttached(
"EnableLog",
typeof(bool),
typeof(WindowLog),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.None, OnEnableWindowLogChanged));
public static void SetEnableWindowLog(Window window, bool value)
{
window.SetValue(EnableLogProperty, value);
}
public static bool GetEnableWindowLog(Window element)
{
return (bool)element.GetValue(EnableLogProperty);
}
private static void OnEnableWindowLogChanged(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
Window window = dependencyObject as Window;
if (window == null)
{
return;
}
if (GetEnableWindowLog(window))
{
Register(window);
}
else
{
Unregister(window);
}
}
private static void Unregister(Window window)
{
window.Closing -= Window_Closing;
window.Activated -= Window_Activated;
window.Closed -= Window_Closed;
}
private static void Register(Window window)
{
window.Closing += Window_Closing;
window.Activated += Window_Activated;
window.Closed += Window_Closed;
}
private static void Window_Closed(object sender, EventArgs e)
{
Window window = (Window)sender;
window.Closing -= Window_Closing;
window.Activated -= Window_Activated;
window.Closed -= Window_Closed;
}
private static void Window_Activated(object sender, EventArgs e)
{
// do something
}
private static void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// do something
}
}
使用
<Window x:Class="Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:attachments="clr-namespace:Wpf.Attachments"
attachments:WindowLog.EnableWindowLog="true">
<StackPanel>
</StackPanel>
相關問題
- 1. 如何查找應用程序使用的所有IP地址?
- 2. 如何查找應用程序的所有依賴關係?
- 3. iOS應用程序如何在iPhone上查找所有其他應用程序?
- 4. 在WPF應用程序中查找所有打開的彈出窗口
- 5. 如何獲取文件中WPF應用程序的所有AutomationID?
- 6. WPF中的ShowDialog
- 7. 如何在WPF應用程序中查找內存泄漏
- 8. Windows Form Show vs ShowDialog
- 9. Facebook Canvas應用程序 - 查找已安裝應用程序的所有用戶
- 10. 如何關閉ShowDialog窗口中的主窗口或應用程序
- 11. 如何將樣式應用於WPF應用程序中的所有窗口?
- 12. 如果使用ShowDialog()而不是Show()
- 13. 如何使用WPF或Winforms應用程序中的System.ComponentModel.DataAnnotations
- 14. 如何找出我應用程序中所有CPU的使用情況
- 15. WPF - 如何爲應用程序中的所有控件啓用TextFormattingMode =「Display」?
- 16. 如何在wpf應用程序中傳遞gridrow中的所有值?
- 17. Silverlight或WPF應用程序或WPF瀏覽器應用程序在本地運行的應用程序?
- 18. Android:如何找到Facebook應用程序ID的所有者?
- 19. 查找部署在weblogic應用程序上的所有ejbs
- 20. 如何查找控件(WPF,C#)中的所有控件?
- 21. 如何在WPF或Silverlight應用程序中使用EPS文件?
- 22. 如何查找由第三方應用程序創建的所有文檔?
- 23. 隱藏WPF應用程序中的所有按鈕
- 24. Wpf:列出應用程序中的所有控件名稱
- 25. 如何將WPF中的evenHandler設置爲所有窗口(整個應用程序)?
- 26. 如何通過WPF中的所有應用程序來維護menuBar和StatusBar
- 27. 在WPF應用程序中查找SQL服務器
- 28. 在WPF應用程序中查找嵌入式控件
- 29. 通過應用程序查找和管理所有YouTube上傳
- 30. 使用Show而不是ShowDialog的C#凍結過程