ejemplo c# wpf datepicker

c# - ejemplo - DatePicker lanza una excepción al cambiar el mes



datepicker textbox wpf (5)

(Como necesitaba algo de diversión) Traté de investigar un poco sobre su caso y pude reproducir la excepción mencionada. Al habilitar el paso a la fuente de .NET Framework y cualquier otra cosa que encontré, pude identificar la excepción al método Invoke de la clase ElementUtil en PresentationCore.dll . El código correspondiente del método se ve así:

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; }

Teniendo en cuenta este código, la única razón posible (en mi opinión) es que el despachador especificado sea null . Aunque encuentro el comentario

// ¡El despachador nulo probablemente significa que la imagen está en mal estado!

Curioso, en realidad no tengo idea de por qué este es el caso. Me cansé de depurar ese hecho pero no pude obtener ninguna información significativa. Solo siguiendo stacktrace (que abrió mis ojos nuevamente sobre lo que está pasando si "simplemente hacemos clic en un botón"):

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

Solo por diversión, aquí está el mismo seguimiento de pila que el anterior en forma gráfica:

Así que mi conclusión es que ...

  • ... La respuesta de Mike Strobel es la más cercana que he visto
  • ... a partir de ahora yo mismo soy curioso

Cambiar el mes de un DatePicker lanza esta excepción:

System.Windows.Automation.ElementNotAvailableException: ''El elemento no existe o está virtualizado; use el patrón de VirtualizedItem si es compatible. ''

El seguimiento de la pila:

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

Creé un proyecto simple con un solo DatePicker en la ventana principal y da la misma excepción.

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

Versión de .NET Framework: 4.6

Encontré el mismo problema en una question 6 años, ¡pero no hay respuesta hasta ahora!

Editar :

Probé diferentes versiones de .NET Framework: 4.5, 4.6.1, y el problema sigue siendo el mismo.


Es difícil reproducir tu problema. Las siguientes sugerencias pueden ayudarte:

  • Otro proceso puede afectar a su programa. ¿ UISpy utilidades como Snoop o UISpy ?

  • Su problema puede estar relacionado con un hardware de bajo rendimiento o un error de software del proveedor. Vea here respuesta para resolver este problema.

  • Su problema puede estar relacionado con la prestación de una copia del control de interfaz de usuario que no existe por alguna razón. Vea esta discusión para más detalles.


La excepción parece depender de que el servicio de entrada de Tablet PC esté habilitado. Si tuviera que adivinar, el error se produce en el código de automatización de la interfaz de usuario que solo se ejecuta cuando la entrada basada en el lápiz está disponible (y posiblemente la entrada basada en el tacto). He visto que el servicio induce efectos secundarios indeseables en aplicaciones de WPF anteriormente, y la mayoría de esos problemas también estaban relacionados con la automatización de la interfaz de usuario.

Dado que esto parece ser una excepción de "primera oportunidad" (se maneja en algún lugar del marco), las únicas personas que deberían darse cuenta son los desarrolladores que tienen su IDE configurado para interrumpir todas las excepciones (a diferencia de las excepciones no manejadas). Si ese es el caso, y si esos desarrolladores no están usando las capacidades de entrada de lápiz o de toque, podría ser más fácil simplemente deshabilitar el Servicio de entrada de Tablet PC y seguir adelante con sus vidas.

Alternativamente, puede configurar Visual Studio para que no se interrumpa en ese tipo de excepción en particular, que de todos modos solo pertenece a la automatización de UI

Dado que las cosas son bastante lentas en la oficina esta semana, dedicaré más tiempo a estudiar esto. Si puedo encontrar una solución basada en código, actualizaré mi respuesta aquí. Pero por su aspecto, la interfaz de usuario se construye casi completamente mediante programación, por lo que probablemente no sea algo que pueda solucionarse con una plantilla personalizada simple.


Si te fijas en la documentación de microsoft dice:

Esta excepción puede producirse si el elemento estaba en un cuadro de diálogo que se cerró o una aplicación que se cerró o finalizó.

¿Podría ser posible que esté cerrando la ventana en un evento "cambiar mes"?


Una posible solución sería intentar, capturar, finalmente la excepción de UIAnimation y no generar ningún evento (cuadros de mensajes, registros de errores) cuando ocurra. Solo deja que el código continúe como si nada hubiera pasado.