Friday, September 21, 2012

WinRT: A method was called at an unexpected time. WinRT Information: An eventhandler has already been registered.

For a WinRT application I’m building I decided to support the Share charm. This is done through the use of the DataTransferManager class.
So in the constructor of my page, I added the following code to listen for Share requests:
_manager = DataTransferManager.GetForCurrentView();
_manager.DataRequested += manager_DataRequested;
This seems to work fine but when I moved to another page and navigated back afterwards, I always got the following error message:

“An exception of type 'System.InvalidOperationException' occurred in mscorlib.dll but was handled in user code. A method was called at an unexpected time.WinRT information: An event handler has already been registered”

clip_image002

I first tried to solve it by unregistering the event handler in the constructor before registering it but this didn’t help:

_manager = DataTransferManager.GetForCurrentView();
_manager.DataRequested -= manager_DataRequested;
_manager.DataRequested += manager_DataRequested;
Instead you have to unregister the event when you navigate away from the page:
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{ 
 var manager = DataTransferManager.GetForCurrentView();
  manager.DataRequested -= manager_DataRequested;
 
 base.OnNavigatingFrom(e);
}
I don’t know if it’s a bug in the WinRT framework but it’s certainly unexpected behavior.

1 comment:

Anonymous said...

Thank you, this was tripping me up no end.
Simple resolution when you know the tricks.