6 using System.Windows.Media.Animation;
7 using System.Diagnostics;
8 using System.Windows.Markup;
17 namespace SiliconStudio.Presentation.Diagnostics
23 public static class TriggerTracing
25 static TriggerTracing()
28 PresentationTraceSources.Refresh();
29 PresentationTraceSources.AnimationSource.Listeners.Clear();
30 PresentationTraceSources.AnimationSource.Listeners.Add(
new TriggerTraceListener());
31 PresentationTraceSources.AnimationSource.Switch.Level = SourceLevels.All;
34 #region TriggerName attached property
42 public static string GetTriggerName(TriggerBase trigger)
44 return (
string)trigger.GetValue(TriggerNameProperty);
53 public static void SetTriggerName(TriggerBase trigger,
string value)
55 trigger.SetValue(TriggerNameProperty, value);
58 public static readonly DependencyProperty TriggerNameProperty =
59 DependencyProperty.RegisterAttached(
62 typeof(TriggerTracing),
63 new UIPropertyMetadata(
string.Empty));
67 #region TraceEnabled attached property
74 public static bool GetTraceEnabled(TriggerBase trigger)
76 return (
bool)trigger.GetValue(TraceEnabledProperty);
84 public static void SetTraceEnabled(TriggerBase trigger,
bool value)
86 trigger.SetValue(TraceEnabledProperty, value);
89 public static readonly DependencyProperty TraceEnabledProperty =
90 DependencyProperty.RegisterAttached(
93 typeof(TriggerTracing),
94 new UIPropertyMetadata(
false, OnTraceEnabledChanged));
96 private static void OnTraceEnabledChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e)
98 var triggerBase = d as TriggerBase;
100 if (triggerBase == null)
103 if (!(e.NewValue is
bool))
106 if ((
bool)e.NewValue)
110 var storyboard =
new TriggerTraceStoryboard(triggerBase, TriggerTraceStoryboardType.Enter);
111 triggerBase.EnterActions.Insert(0,
new BeginStoryboard() { Storyboard = storyboard });
113 storyboard =
new TriggerTraceStoryboard(triggerBase, TriggerTraceStoryboardType.Exit);
114 triggerBase.ExitActions.Insert(0,
new BeginStoryboard() { Storyboard = storyboard });
120 foreach (TriggerActionCollection actionCollection
in new[] { triggerBase.EnterActions, triggerBase.ExitActions })
122 foreach (TriggerAction triggerAction
in actionCollection)
124 BeginStoryboard bsb = triggerAction as BeginStoryboard;
126 if (bsb != null && bsb.Storyboard != null && bsb.Storyboard is TriggerTraceStoryboard)
128 actionCollection.Remove(bsb);
138 private enum TriggerTraceStoryboardType
146 private class TriggerTraceStoryboard : Storyboard
148 public TriggerTraceStoryboardType StoryboardType {
get;
private set; }
149 public TriggerBase TriggerBase {
get;
private set; }
151 public TriggerTraceStoryboard(TriggerBase triggerBase, TriggerTraceStoryboardType storyboardType)
153 TriggerBase = triggerBase;
154 StoryboardType = storyboardType;
161 private class TriggerTraceListener : TraceListener
163 public override void TraceEvent(TraceEventCache eventCache,
string source, TraceEventType eventType,
int id,
string format, params
object[] args)
165 base.TraceEvent(eventCache, source, eventType, id,
format, args);
167 if (format.StartsWith(
"Storyboard has begun;"))
169 TriggerTraceStoryboard storyboard = args[1] as TriggerTraceStoryboard;
170 if (storyboard != null)
176 object targetElement = args[5];
179 INameScope namescope = (INameScope)args[7];
181 TriggerBase triggerBase = storyboard.TriggerBase;
182 string triggerName = GetTriggerName(storyboard.TriggerBase);
184 Debug.WriteLine(string.Format(
"Element: {0}, {1}: {2}: {3}",
186 triggerBase.GetType().Name,
188 storyboard.StoryboardType));
193 public override void Write(
string message)
197 public override void WriteLine(
string message)
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format