DatePicker在更改Month时抛出异常

时间:2017-12-19 10:11:12

标签: c# wpf datepicker

更改DatePicker的月份会引发此异常:

  

System.Windows.Automation.ElementNotAvailableException:'元素做   不存在或虚拟化;如果是,请使用VirtualizedItem Pattern   。支持'

堆栈跟踪:

  

在MS.Internal.Automation.ElementUtil.Invoke(AutomationPeer peer,   DispatcherOperationCallback工作,对象arg)at   MS.Internal.Automation.ElementProxy.GetPropertyValue(Int32 property)

我创建了一个只在主窗口上只有一个DatePicker的简单项目,它提供了相同的异常。

<DatePicker x:Name="datePicker1" Width="150" />

.NET Framework版本:4.6

我在6岁question找到同样的问题,但直到现在都没有回答!

修改

我尝试了不同的.NET Framework版本:4.5,4.6.1,问题仍然相同。

5 个答案:

答案 0 :(得分:4)

该例外似乎取决于启用 Tablet PC输入服务。如果我不得不猜测,错误发生在UI自动化代码中,该代码仅在基于笔的输入可用时运行(并且可能是基于触摸的输入)。我之前看到该服务在WPF应用程序中引起了不良副作用,并且大多数问题与UI自动化相关。

由于这似乎是“第一次机会”异常(它在框架中的某处处理),唯一应该注意的是开发人员将IDE配置为中断所有异常(而不是仅处理未处理的异常) 。如果情况确实如此,并且如果这些开发人员实际上并没有使用笔或触摸输入功能,那么最简单的方法就是禁用Tablet PC输入服务并继续您的生活。

或者,您可以将Visual Studio配置为不中断该特定异常类型,该类型仅适用于UI自动化。

由于本周办公室的情况非常缓慢,我会花一些时间来研究这个问题。如果我能找到基于代码的解决方案,我会在这里更新我的答案。但从它的外观来看,UI几乎完全是以编程方式构建的,所以这可能不是你可以通过简单的自定义模板修复的。

答案 1 :(得分:3)

如果你看on the microsoft documentation,就说:

  

如果元素位于已关闭的对话框或已关闭或终止的应用程序中,则可以引发此异常。

您是否有可能在“更改月份”事件中关闭窗口?

答案 2 :(得分:3)

很难重现您的问题。下一个建议可能会对您有所帮助:

  • another process可能会对您的计划产生影响。您是否使用SnoopUISpy等实用程序?

  • 您的问题可能与低性能硬件或供应商软件错误有关。有关解决此问题的信息,请参阅here答案

  • 您的问题可能与呈现由于某些原因而不存在的UI控件副本有关。有关详细信息,请参阅this discussion

答案 3 :(得分:2)

(因为我需要一些转移)我试图对你的案子做一些研究,并可以重现上面提到的例外。启用 .NET Framework源代码以及我能找到的任何其他内容我能够查明InvokeElementUtil类的PresentationCore.dll方法的异常。方法的corresponding code如下所示:

internal static object Invoke(AutomationPeer peer, DispatcherOperationCallback work, object arg)
{
    Dispatcher dispatcher = peer.Dispatcher;

    // Null dispatcher likely means the visual is in bad shape!
    if( dispatcher == null )
    {
        throw new ElementNotAvailableException();
    }

    Exception remoteException = null;
    bool completed = false;

    object retVal = dispatcher.Invoke(            
        DispatcherPriority.Send,
        TimeSpan.FromMinutes(3),
        (DispatcherOperationCallback) delegate(object unused)
        {
            try
            {
                return work(arg);
            }
            catch(Exception e)
            {
                remoteException = e;
                return null;
            }
            catch        //for non-CLS Compliant exceptions
            {
                remoteException = null;
                return null;
            }
            finally
            {
                completed = true;
            }

        },
        null);

    if(completed)
    {
        if(remoteException != null)
        {
            throw remoteException;
        }
    }
    else
    {
        bool dispatcherInShutdown = dispatcher.HasShutdownStarted;

        if(dispatcherInShutdown)
        {
            throw new InvalidOperationException(SR.Get(SRID.AutomationDispatcherShutdown));
        }
        else
        {
            throw new TimeoutException(SR.Get(SRID.AutomationTimeout));
        }
    }

    return retVal;

}

考虑到这些代码(在我看来),唯一可能的原因是,指定的调度程序是null。我找到了评论

  

//空调度可能意味着视觉形状不好!

有趣的是,我实际上不知道为什么会这样。我厌倦了调试这个事实但却无法得到任何有意义的信息。只有跟踪堆栈跟踪(如果我们&#34;只需点击一个按钮&#34;再次打开了我的眼睛):

PresentationCore.dll!MS.Internal.Automation.ElementUtil.Invoke(System.Windows.Automation.Peers.AutomationPeer peer, System.Windows.Threading.DispatcherOperationCallback work, object arg)
PresentationCore.dll!MS.Internal.Automation.ElementProxy.GetPropertyValue(int property)
[Native to Managed Transition]
UIAutomationCore.dll!ProviderCallouts::RawGetPropertyValue(struct IRawElementProviderSimple *,int,struct tagVARIANT *)
UIAutomationCore.dll!ProviderCallouts::GetPropertyValue(struct IRawElementProviderSimple *,unsigned short,class ProviderEntryPoint *,int,struct tagVARIANT *)
UIAutomationCore.dll!InProcClientAPIStub::GetPropertyValue(char *)
UIAutomationCore.dll!InProcClientAPIStub::InvokeInProcAPI(struct ITargetContextInvoker *,enum Protocol_MethodId,...)
UIAutomationCore.dll!AccessibleProxy::IsControl(struct IRawElementProviderFragment *,struct ITargetContextInvoker *)
UIAutomationCore.dll!AccessibleProxy::NormalizeUpwards(struct IRawElementProviderFragment *,struct ITargetContextInvoker *,struct IRawElementProviderFragment * *)
UIAutomationCore.dll![thunk]:EditProxy::Release`adjustor{32}' (void)
UIAutomationCore.dll!_UiaReturnRawElementProvider@16()
[Managed to Native Transition]
UIAutomationProvider.dll!MS.Internal.Automation.UiaCoreProviderApi.UiaReturnRawElementProvider(System.IntPtr hwnd = 0x000406ce, System.IntPtr wParam = 0xffffffff, System.IntPtr lParam = 0x00000149, System.Windows.Automation.Provider.IRawElementProviderSimple el = {MS.Internal.Automation.ElementProxy})
UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.ReturnRawElementProvider(System.IntPtr hwnd = 0x000406ce, System.IntPtr wParam = 0xffffffff, System.IntPtr lParam = 0x00000149, System.Windows.Automation.Provider.IRawElementProviderSimple el = {MS.Internal.Automation.ElementProxy})
PresentationCore.dll!System.Windows.Interop.HwndTarget.CriticalHandleWMGetobject(System.IntPtr wparam, System.IntPtr lparam, System.Windows.Media.Visual root, System.IntPtr handle)
PresentationCore.dll!System.Windows.Interop.HwndTarget.HandleMessage(MS.Internal.Interop.WindowMessage msg, System.IntPtr wparam, System.IntPtr lparam)
PresentationCore.dll!System.Windows.Interop.HwndSource.HwndTargetFilterMessage(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled = false)
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd = 0x000406ce, int msg = 0x0000003d, System.IntPtr wParam = 0xffffffff, System.IntPtr lParam = 0x00000149, ref bool handled = false)
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o)
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source = {System.Windows.Threading.Dispatcher}, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler = null)
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd = 0x000406ce, int msg = 0x0000003d, System.IntPtr wParam = 0xffffffff, System.IntPtr lParam = 0x00000149)
[Native to Managed Transition]
user32.dll!__InternalCallWinProc@20()
user32.dll!InternalCallWinProc()
user32.dll!UserCallWinProcCheckWow(struct _ACTIVATION_CONTEXT *,void *,struct HWND__ *,enum _WM_VALUE,unsigned int,long,void *,int)
user32.dll!_DispatchClientMessage@24()
user32.dll!___fnDWORD@4()
ntdll.dll!_KiUserCallbackDispatcher@12()
user32.dll!_SendMessageTimeoutW@28()
oleacc.dll!NativeIAccessibleFromWindow(unsigned long,unsigned long,struct HWND__ *,unsigned long,struct _GUID const &,void * *)
oleacc.dll!_ORIGINAL_AccessibleObjectFromWindow@24()
oleacc.dll!_AccessibleObjectFromWindow@16()
oleacc.dll!_AccessibleObjectFromEvent@20()
oleacc.dll!_EXTERNAL_AccessibleObjectFromEvent@20()
msctf.dll!_AccessibleObjectFromEvent@20()
msctf.dll!CThreadInputMgr::OnAccFocusEvent()
msctf.dll!WinEventProc()
user32.dll!___ClientCallWinEventProc@4()
ntdll.dll!_KiUserCallbackDispatcher@12()
[Managed to Native Transition]
UIAutomationProvider.dll!MS.Internal.Automation.UiaCoreProviderApi.UiaRaiseAutomationEvent(System.Windows.Automation.Provider.IRawElementProviderSimple provider = {MS.Internal.Automation.ElementProxy}, int eventId = 0x00004e25)
UIAutomationProvider.dll!System.Windows.Automation.Provider.AutomationInteropProvider.RaiseAutomationEvent(System.Windows.Automation.AutomationEvent eventId = {System.Windows.Automation.AutomationEvent}, System.Windows.Automation.Provider.IRawElementProviderSimple provider = {MS.Internal.Automation.ElementProxy}, System.Windows.Automation.AutomationEventArgs e = {System.Windows.Automation.AutomationEventArgs})
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.RaiseAutomationEvent(System.Windows.Automation.Peers.AutomationEvents eventId)
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.RaiseFocusChangedEventHelper(System.Windows.IInputElement newFocus)
PresentationCore.dll!System.Windows.Input.KeyboardDevice.ChangeFocus(System.Windows.DependencyObject focus, int timestamp)
PresentationCore.dll!System.Windows.Input.KeyboardDevice.TryChangeFocus(System.Windows.DependencyObject newFocus, System.Windows.Input.IKeyboardInputProvider keyboardInputProvider, bool askOld, bool askNew, bool forceToNullIfFailed)
PresentationCore.dll!System.Windows.Input.KeyboardDevice.Focus(System.Windows.DependencyObject focus, bool askOld, bool askNew, bool forceToNullIfFailed)
PresentationCore.dll!System.Windows.Input.KeyboardDevice.Focus(System.Windows.IInputElement element)
PresentationCore.dll!System.Windows.UIElement.Focus()
PresentationFramework.dll!System.Windows.Input.KeyboardNavigation.Navigate(System.Windows.DependencyObject currentElement, System.Windows.Input.TraversalRequest request, System.Windows.Input.ModifierKeys modifierKeys, System.Windows.DependencyObject firstElement)
PresentationFramework.dll!System.Windows.FrameworkElement.MoveFocus(System.Windows.Input.TraversalRequest request)
PresentationFramework.dll!System.Windows.Controls.Primitives.CalendarItem.FocusDate(System.DateTime date)
PresentationFramework.dll!System.Windows.Controls.Calendar.OnCalendarButtonPressed(System.Windows.Controls.Primitives.CalendarButton b, bool switchDisplayMode)
PresentationFramework.dll!System.Windows.Controls.Primitives.CalendarItem.Month_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
PresentationCore.dll!System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget)
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate handler, object target)
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(object target, System.Windows.RoutedEventArgs routedEventArgs)
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(object source = {System.Windows.Controls.Primitives.CalendarButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised = true)
PresentationCore.dll!System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject sender = {System.Windows.Controls.Primitives.CalendarButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, System.Windows.RoutedEvent newEvent)
PresentationCore.dll!System.Windows.UIElement.OnMouseUpThunk(object sender, System.Windows.Input.MouseButtonEventArgs e)
PresentationCore.dll!System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget)
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate handler, object target)
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(object target, System.Windows.RoutedEventArgs routedEventArgs)
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(object source = {System.Windows.Shapes.Rectangle}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised = false)
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject sender = {System.Windows.Shapes.Rectangle}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs})
PresentationCore.dll!System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs})
PresentationCore.dll!System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs args, bool trusted)
PresentationCore.dll!System.Windows.Input.InputManager.ProcessStagingArea()
PresentationCore.dll!System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs input)
PresentationCore.dll!System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport)
PresentationCore.dll!System.Windows.Interop.HwndMouseInputProvider.ReportInput(System.IntPtr hwnd, System.Windows.Input.InputMode mode, int timestamp, System.Windows.Input.RawMouseActions actions, int x, int y, int wheel)
PresentationCore.dll!System.Windows.Interop.HwndMouseInputProvider.FilterMessage(System.IntPtr hwnd = 0x000406ce, MS.Internal.Interop.WindowMessage msg = WM_LBUTTONUP, System.IntPtr wParam = 0x00000000, System.IntPtr lParam = 0x005b0066, ref bool handled = false)
PresentationCore.dll!System.Windows.Interop.HwndSource.InputFilterMessage(System.IntPtr hwnd = 0x000406ce, int msg = 0x00000202, System.IntPtr wParam = 0x00000000, System.IntPtr lParam = 0x005b0066, ref bool handled = false)
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd = 0x000406ce, int msg = 0x00000202, System.IntPtr wParam = 0x00000000, System.IntPtr lParam = 0x005b0066, ref bool handled = false)
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o)
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source = {System.Windows.Threading.Dispatcher}, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler = null)
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd = 0x000406ce, int msg = 0x00000202, System.IntPtr wParam = 0x00000000, System.IntPtr lParam = 0x005b0066)
[Native to Managed Transition]
user32.dll!__InternalCallWinProc@20()
user32.dll!InternalCallWinProc()
user32.dll!UserCallWinProcCheckWow(struct _ACTIVATION_CONTEXT *,void *,struct HWND__ *,enum _WM_VALUE,unsigned int,long,void *,int)
user32.dll!_DispatchMessageWorker@8()
user32.dll!_DispatchMessageW@4()
WindowsBase.ni.dll!69d4936c()
[Frames below may be incorrect and/or missing, native debugger attempting to walk managed call stack]
[Managed to Native Transition]
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame})
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame)
PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore)
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window)
PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window)
PresentationFramework.dll!System.Windows.Application.Run()
WpfApp1.exe!WpfApp1.App.Main()
[Native to Managed Transition]
mscoreei.dll!__CorExeMain@0()
mscoree.dll!_ShellShim__CorExeMain@0()
mscoree.dll!__CorExeMain_Exported@0()
ntdll.dll!__RtlUserThreadStart()
ntdll.dll!__RtlUserThreadStart@8()

只是为了好玩,这里的图形形式与上面相同的堆栈跟踪: Stacktrace

所以我的意思是......

答案 4 :(得分:0)

可能的解决方法是尝试,捕获,最后是UIAnimation异常,并在发生时不引发任何事件(消息框,错误日志)。只需让代码继续,好像什么都没发生一样。