internal static void OnVisualChildChanged(DependencyObject parent, DependencyObject child, bool isAdded) { EventHandler <VisualTreeChangeEventArgs> visualTreeChanged = VisualDiagnostics.s_visualTreeChanged; if (visualTreeChanged != null && EnableHelper.IsVisualTreeChangeEnabled) { int index; VisualTreeChangeType changeType; if (isAdded) { index = VisualDiagnostics.GetChildIndex(parent, child); changeType = VisualTreeChangeType.Add; } else { // We cannot reliably get correct child index for a removed child. We'll force it to be -1; index = -1; changeType = VisualTreeChangeType.Remove; } RaiseVisualTreeChangedEvent( visualTreeChanged, new VisualTreeChangeEventArgs(parent, child, index, changeType), // see EnableHelper.IsChangePermitted isPotentialOuterChange: (changeType == VisualTreeChangeType.Add && index == 0 && VisualTreeHelper.GetParent(parent) == null)); } }
static ResourceDictionaryDiagnostics() { IsEnabled = VisualDiagnostics.IsEnabled && VisualDiagnostics.IsEnvironmentVariableSet(null, "ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO"); // internal property, not visible to user IgnorableProperties.Add(typeof(ResourceDictionary).GetProperty("DeferrableContent")); }
// Calls critical method IsEnvironmentVariableSet, but doesn't expose data static ResourceDictionaryDiagnostics() { IsEnabled = VisualDiagnostics.IsEnabled && VisualDiagnostics.IsEnvironmentVariableSet(null, XamlSourceInfoHelper.XamlSourceInfoEnvironmentVariable); // internal property, not visible to user IgnorableProperties.Add(typeof(ResourceDictionary).GetProperty("DeferrableContent")); }
// this method is (also) called via private reflection from test code private static void InitializeEnableXamlSourceInfo(string value) { if (VisualDiagnostics.IsEnabled && VisualDiagnostics.IsEnvironmentVariableSet(value, "ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO") && InitializeXamlObjectEventArgs()) { s_sourceInfoTable = new ConditionalWeakTable <object, XamlSourceInfo>(); } else { s_sourceInfoTable = null; } }
// this method is (also) called via private reflection from test code private static void InitializeEnableXamlSourceInfo(string value) { if (VisualDiagnostics.IsEnabled && VisualDiagnostics.IsEnvironmentVariableSet(value, XamlSourceInfoHelper.XamlSourceInfoEnvironmentVariable) && InitializeXamlObjectEventArgs()) { s_sourceInfoTable = new ConditionalWeakTable <object, XamlSourceInfo>(); } else { s_sourceInfoTable = null; } }
static BindingDiagnostics() { IsEnabled = VisualDiagnostics.IsEnabled && VisualDiagnostics.IsEnvironmentVariableSet(null, XamlSourceInfoHelper.XamlSourceInfoEnvironmentVariable); if (IsEnabled) { // Listeners may miss the initial set of binding failures, so cache events until the first listener attaches. // Normally there will only be one listener added soon after the process starts, // and it will want to know about any binding failures that already happened. s_pendingEvents = new List <BindingFailedEventArgs>(); s_pendingEventsLock = new object(); } }
internal static void OnVisualChildChanged(DependencyObject parent, DependencyObject child, bool isAdded) { EventHandler <VisualTreeChangeEventArgs> visualTreeChanged = VisualDiagnostics.s_visualTreeChanged; if (visualTreeChanged != null && VisualDiagnostics.IsVisualTreeChangeEnabled) { int index; VisualTreeChangeType changeType; if (isAdded) { index = VisualDiagnostics.GetChildIndex(parent, child); changeType = VisualTreeChangeType.Add; } else { // We cannot reliably get correct child index for a removed child. We'll force it to be -1; index = -1; changeType = VisualTreeChangeType.Remove; } VisualTreeChangeEventArgs args = new VisualTreeChangeEventArgs(parent, child, index, changeType); visualTreeChanged(null, args); } }