2009-09-02 9 views
1

Je reçois un bogue intermittent étrange qui semble lié à VisualStateManager dans la boîte à outils WPF. Je développe une application qui utilise le Toolkit (juin 2009), mais pas le VisualStateManager. Quoi qu'il en soit, je reçois l'erreur suivante:WPF Toolkit: Bogue VisualStateGroup?

'TextColor' name cannot be found in the name scope of 'System.Windows.Controls.Grid'. 

Inutile de dire que je ne suis pas en train de changer une propriété TextColor sur une grille de contrôle.

L'exception ne pointe sur aucune ligne particulière dans mon code source. Au lieu de cela, il pointe vers une ligne dans le VisualStateManager - j'ai copié le vidage IL ci-dessous. J'ai également posté le texte intégral de l'exception.

Est-ce que quelqu'un d'autre a rencontré ce problème? Merci de votre aide.

*************************************** 
EXCEPTION TEXT 
*************************************** 
System.InvalidOperationException was unhandled 
    Message="'TextColor' name cannot be found in the name scope of 'System.Windows.Controls.Grid'." 
    Source="PresentationFramework" 
    StackTrace: 
     at System.Windows.Media.Animation.Storyboard.ResolveTargetName(String targetName, INameScope nameScope, DependencyObject element) 
     at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer) 
     at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer) 
     at System.Windows.Media.Animation.Storyboard.BeginCommon(DependencyObject containingObject, INameScope nameScope, HandoffBehavior handoffBehavior, Boolean isControllable, Int64 layer) 
     at System.Windows.Media.Animation.Storyboard.Begin(FrameworkElement containingObject, HandoffBehavior handoffBehavior, Boolean isControllable) 
     at System.Windows.VisualStateGroup.StartNewThenStopOld(FrameworkElement element, Storyboard[] newStoryboards) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\System\Windows\VisualStateGroup.cs:line 109 
     at System.Windows.VisualStateManager.GoToStateInternal(Control control, FrameworkElement element, VisualStateGroup group, VisualState state, Boolean useTransitions) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\System\Windows\VisualStateManager.cs:line 234 
     at System.Windows.VisualStateManager.GoToState(Control control, String stateName, Boolean useTransitions) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\System\Windows\VisualStateManager.cs:line 67 
     at Microsoft.Windows.Controls.ButtonBaseBehavior.UpdateState(Control control, Boolean useTransitions) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\Microsoft\Windows\Controls\ButtonBaseBehavior.cs:line 77 
     at Microsoft.Windows.Controls.ControlBehavior.UpdateStateHandler(Object o, EventArgs e) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\Microsoft\Windows\Controls\ControlBehavior.cs:line 54 
     at MS.Internal.ComponentModel.PropertyChangeTracker.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args) 
     at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs) 
     at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
     at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType) 
     at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal) 
     at System.Windows.DependencyObject.SetValue(DependencyPropertyKey key, Object value) 
     at System.Windows.DependencyObject.SetValue(DependencyPropertyKey dp, Boolean value) 
     at System.Windows.ReverseInheritProperty.FirePropertyChangeInAncestry(DependencyObject element, Boolean oldValue, DeferredElementTreeState treeState) 
     at System.Windows.ReverseInheritProperty.FirePropertyChangeInAncestry(DependencyObject element, Boolean oldValue, DeferredElementTreeState treeState) 
     at System.Windows.ReverseInheritProperty.FirePropertyChangeInAncestry(DependencyObject element, Boolean oldValue, DeferredElementTreeState treeState) 
     at System.Windows.ReverseInheritProperty.FirePropertyChangeInAncestry(DependencyObject element, Boolean oldValue, DeferredElementTreeState treeState) 
     at System.Windows.ReverseInheritProperty.OnOriginValueChanged(DependencyObject oldOrigin, DependencyObject newOrigin, DeferredElementTreeState& oldTreeState) 
     at System.Windows.Input.MouseDevice.ChangeMouseOver(IInputElement mouseOver, Int32 timestamp) 
     at System.Windows.Input.MouseDevice.PreNotifyInput(Object sender, NotifyInputEventArgs e) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
     at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
     at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
     at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
     at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
     at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg) 
     at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
     at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.Run() 
     at System.Windows.Application.RunDispatcher(Object ignore) 
     at System.Windows.Application.RunInternal(Window window) 
     at System.Windows.Application.Run(Window window) 
     at System.Windows.Application.Run() 
     at ProjectManager.App.Main() in D:\Users\dcveeneman\Documents\Visual Studio 2008\Projects\FsProjectManager\ProjectManager\obj\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

VS 2008 désassemblage


Address: Microsoft.Windows.Controls.ControlBehavior.UpdateStateHandler(object, System.EventArgs) 

Dissassembly: (VS 2008 caret indicates exception thrown at line 70, the NOP) 

    --- C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\VSM\VisualStateManager\Microsoft\Windows\Controls\ControlBehavior.cs 
    00000000 push  ebp 
    00000001 mov   ebp,esp 
    00000003 sub   esp,10h 
    00000006 mov   dword ptr [ebp-4],ecx 
    00000009 mov   dword ptr [ebp-8],edx 
    0000000c cmp   dword ptr ds:[0BB401C8h],0 
    00000013 je   0000001A 
    00000015 call  53D8DC91 
    0000001a xor   edx,edx 
    0000001c mov   dword ptr [ebp-0Ch],edx 
    0000001f mov   edx,dword ptr [ebp-8] 
    00000022 mov   ecx,55BDE49Ch 
    00000027 call  53B3F332 
    0000002c mov   dword ptr [ebp-0Ch],eax 
    0000002f cmp   dword ptr [ebp-0Ch],0 
    00000033 jne   00000063 
    00000035 mov   ecx,601D43E0h 
    0000003a call  F1D25114 
    0000003f mov   dword ptr [ebp-10h],eax 
    00000042 mov   edx,0BB40010h 
    00000047 mov   ecx,700001A9h 
    0000004c call  53C84292 
    00000051 mov   edx,eax 
    00000053 mov   ecx,dword ptr [ebp-10h] 
    00000056 call  51E0669C 
    0000005b mov   ecx,dword ptr [ebp-10h] 
    0000005e call  53C843C7 
    00000063 push  1  
    00000065 mov   edx,dword ptr [ebp-0Ch] 
    00000068 mov   ecx,dword ptr [ebp-4] 
    0000006b mov   eax,dword ptr [ecx] 
    0000006d call  dword ptr [eax+48h] 
    00000070 nop    
    00000071 mov   esp,ebp 
    00000073 pop   ebp 
    00000074 ret   4  

Répondre

1

Je ne peux pas le croire. J'ai trouvé ma réponse juste après avoir posté cette question. Voici ce qui s'est passé: J'ai créé un modèle de contrôle pour le contrôle du calendrier de la boîte à outils WPF (j'avais besoin d'un calendrier sans boutons de navigation). J'ai donc modifié une copie du modèle de contrôle existant et, bien sûr, le modèle de contrôle essaie de définir un TextProperty (inexistant) sur un contrôle Grid de mise en page. Et cela se produit dans un VisualStateGroup utilisé par le modèle de contrôle d'origine.

Donc, maintenant tout ce que j'ai à faire est de savoir si j'ai introduit le bug lorsque j'ai modifié le modèle de contrôle, ou s'il était là avant que je commence à jouer avec. En tout cas, le mystère a été résolu!

David Veeneman
Systems Prospective