19

Changing the month of a DatePicker throws this exception:

System.Windows.Automation.ElementNotAvailableException: 'Element does not exist or it is virtualized; use VirtualizedItem Pattern if it is supported.'

The Stack Trace:

at MS.Internal.Automation.ElementUtil.Invoke(AutomationPeer peer, DispatcherOperationCallback work, Object arg) at MS.Internal.Automation.ElementProxy.GetPropertyValue(Int32 property)

I created a simple project with only one DatePicker on the main window and it gives the same exception.

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

.NET Framework version: 4.6

I found the same problem in a 6 years old question, but no answer till now!

Edit:

I tried different .NET Framework versions: 4.5, 4.6.1, and the problem still the same.

Bassem
  • 820
  • 9
  • 17
  • 2
    It may be a [bug?](https://stackoverflow.com/questions/46587812/element-does-not-exist-or-it-is-virtualized-use-virtualizeditem-pattern-if-it-i)? – Ferus7 Dec 19 '17 at 10:26
  • @Ferus7, I've read these questions too. So many questions there with no answer. Not even a clue why it works on some machines and does not on others! – Bassem Dec 19 '17 at 10:50
  • Yes, you are right, it may be a bug, becauseit looks like there is not any solution there. – Ferus7 Dec 19 '17 at 10:52
  • 1
    How exaclty are you "changing the month"? – mm8 Dec 19 '17 at 15:32
  • @mm8, selecting the month with the mouse clicks. – Bassem Dec 19 '17 at 18:38
  • 1
    That works just fine for me. Your issue is not reproducible. – mm8 Dec 20 '17 at 08:10
  • @mm8, it works on some machines and does not on others. As Fersu7 said it is a bug, and I try to find a work around. – Bassem Dec 20 '17 at 09:20
  • 1
    @jsanalytics, it seems that the only solution is not to use that control and use another as you suggested. This package [Extended WPF Toolkit](https://github.com/xceedsoftware/wpftoolkit) is a great add, thank you for the suggestion. If you would please post this comment as an answer, it would help others too! – Bassem Dec 24 '17 at 06:51
  • 2
    Looks like a race-condition. The `DatePicker` contains a huge number of "virtual" month GUI displays, but it doesn't actually try to generate them until the `DatePicker` would show them. My guess is that the synchronization logic's messed up, such that it's possible for the `DatePicker` to try to show the month's GUI component before that GUI component's fully constructed, resulting in the `Exception`. – Nat Dec 25 '17 at 04:50
  • @Nat, is there a way to ensure that the GUI component is fully constructed? – Bassem Dec 25 '17 at 05:05
  • 2
    Not too sure how it's working internally yet. At first, I thought that I couldn't reproduce the bug because `DatePicker` is working fine for me, except for being a little laggy. But I can see that the Output window in Visual Studio's silently reporting `Exception thrown: 'System.Windows.Automation.ElementNotAvailableException' in PresentationFramework.dll` and then `Exception thrown: 'System.Windows.Automation.ElementNotAvailableException' in PresentationCore.dll`. The exceptions aren't causing the program to stop or the control to stop functioning, though. Do they terminate your app? – Nat Dec 25 '17 at 05:16
  • @Nat, only in Debug mode. But if I run it without debugging, the exception is not shown. – Bassem Dec 25 '17 at 05:19
  • 2
    So it causes a fatal exception in Debug mode if it's not `catch`'d, but Release mode runs just fine? – Nat Dec 25 '17 at 05:20
  • 5
    Apparently going to `Tools -> Options -> Debugging -> General` and checking `Enable Just My Code` causes the exception to stop being reported. The exception appears to originate in the closed-source WPF .DLL's, and it's caught there, too. When `Just My Code` is enabled, the control responds quickly and the exceptions aren't reported. But when `Just My Code` is disabled, the debugger shows the exceptions being thrown and caught, and there's noticeably more lag. – Nat Dec 25 '17 at 05:30
  • Could you upload your project to some cloud storage for further investigation? – JohnyL Dec 26 '17 at 19:31
  • @BassemAkl did you updated windows recently ? – Djordje Dec 27 '17 at 13:49
  • 1
    According to msdn: This exception can be raised if the element was in a dialog box that was closed, or an application that was closed or terminated. – maddy23285 Dec 28 '17 at 07:49
  • 1
    This particular error is occur when there is some corruption with Windows.UI.Xaml.dll or its linked dlls. or if any of them is missing – maddy23285 Dec 28 '17 at 07:55

5 Answers5

5

The exception appears to depend on the Tablet PC Input Service being enabled. If I had to guess, the error occurs in UI Automation code that only runs when pen-based input is available (and possibly touch-based input). I've seen that service induce undesirable side effects in WPF applications before, and most of those issues were also related to UI Automation.

Since this appears to be a "first chance" exception (it gets handled somewhere in the framework), the only people who should notice are developers who have their IDE configured to break on all exceptions (as opposed to only unhandled exceptions). If that is indeed the case, and if those developers are not actually using the pen or touch input capabilities, it might be easiest to just disable the Tablet PC Input Service and move on with your lives.

Alternatively, you could configure Visual Studio to not break on that particular exception type, which only pertains to UI Automation anyway.

Since things are pretty slow at the office this week, I will spend some additional time looking into this. If I can find a code-based solution, I will update my answer here. But from the look of it, the UI is constructed almost entirely programmatically, so this probably isn't something you can fix with a simple custom template.

Mike Strobel
  • 25,075
  • 57
  • 69
3

If you look on the microsoft documentation it says:

This exception can be raised if the element was in a dialog box that was closed, or an application that was closed or terminated.

Could it be possible that you're closing the window on a "change month" event?

Firas
  • 96
  • 8
  • 7
    Thank you for your effort. As I said, I created a simple project with only a DatePicker with no change to the code behind, yet the exception still there. – Bassem Dec 19 '17 at 10:56
3

It is difficult to reproduce your issue. The next suggestions may help you:

  • another process may affect to your program. Do you use utilities like Snoop or UISpy?

  • your problem may be related to low-performance hardware or vendor software bug. See here answer for resolving this issue

  • your problem may be related to rendering a copy of UI-control which doesn't exist for some reasons. See this discussion for more details

Didgeridoo
  • 1,222
  • 2
  • 14
  • 21
  • Check the output window and you will see it. – Maverick Meerkat Dec 27 '17 at 09:13
  • @DavidRefaeli I created the app as written above in the comments with only one `DatePicker` with `FirstChanceException` event handler. .Net Framework 4.6, Visual Studio 2017. I had no `ElementNotAvailableException` exception. – Didgeridoo Dec 27 '17 at 09:52
  • check out Nat comment to the question - I also didn't see it at first. It is shown in the output window though. (At least for me) – Maverick Meerkat Dec 27 '17 at 13:41
  • @DavidRefaeli I read the comments and tried to reproduce the issue as @Nat wrote, but I couldn't catch the exception (I disabled `Just My Code` and used `Exception Settings` window). I saw only `System.FormatException: String was not recognized as a valid DateTime. at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)` in `Output` window when I input incorrect date. – Didgeridoo Dec 27 '17 at 15:12
2

(As I needed some diversion) I tried to do some research on your case and could reproduce the mentioned exception. Enabling .NET Framework source stepping and anything else I could find I was able to pinpoint the exception to the Invoke method of the ElementUtil class in the PresentationCore.dll. The corresponding code of the method looks like this:

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;

}

Taking this code into consideration the (in my opinion) only possible reason is, that the specified dispatcher is null. Altough I find the comment

// Null dispatcher likely means the visual is in bad shape!

funny, I have actually no idea why this is the case. I tired to debugging that fact but was unable to get any meaningful information. Only following stacktrace (which opened my eyes again about what is going on if we "just click a button"):

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()

Just for fun here ist the same stacktrace as above in graphical form: Stacktrace

So my conslusion is that...

Markus Safar
  • 6,324
  • 5
  • 28
  • 44
0

A possible work around would be to Try, Catch, Finally the UIAnimation exception and not raise any events (message boxes, error logs) when it occurs. Just let the code continue on as if nothing happened.

user17260
  • 24
  • 1