1

WPF Toolkit の VisualStateManager に関連していると思われる奇妙な断続的なバグが発生しています。Toolkit (2009 年 6 月) を使用するアプリケーションを開発していますが、VisualStateManager は使用していません。それにもかかわらず、次のエラーが発生します。

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

言うまでもなく、Grid コントロールの TextColor プロパティを変更しようとしているわけではありません。

例外は、ソース コードの特定の行を指していません。代わりに、VisualStateManager の行を指しています。以下の IL ダンプをコピーしました。例外の全文も掲載しました。

他の誰かがこの問題に遭遇しましたか? ご協力いただきありがとうございます。

***************************************
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 分解


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    
4

1 に答える 1

1

信じられない。この質問を投稿した直後に答えが見つかりました。発生した内容は次のとおりです。WPFツールキットのカレンダーコントロール用のコントロールテンプレートを作成しました(ナビゲーションボタンのないカレンダーが必要でした)。そこで、既存のコントロールテンプレートのコピーを変更しましたが、確かに、コントロールテンプレートは、レイアウトグリッドコントロールに(存在しない)TextPropertyを設定しようとします。また、元のコントロールテンプレートで使用されるVisualStateGroup内で発生します。

だから、今私がしなければならないのは、コントロールテンプレートを変更したときにバグを導入したのか、それともそれをいじり始める前にバグがあったのかを理解することだけです。とにかく、謎は解けました!

David Veeneman
Foresight Systems

于 2009-09-02T21:41:34.460 に答える