2015-04-04 36 views
0

我有一個要求來追蹤WPF中的所有Window.ShowShowDialog()。 主要目的是我想知道什麼時候所有Window in App打開或關閉。 類似的,當關閉WindowA或ChildWindowA時,我想要爲其打開/關閉的視圖編寫AuditLog,我不想爲每個Window或ChildWindow編寫代碼並將其寫入App實例級別以處理所有打開/關閉窗口或應用程序中的ChildWindow。如何查找應用程序中的所有Show或ShowDialog WPF

回答

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> 

相關問題