internal static async Task<IHTMLBinding> Bind(IHTMLWindowProvider windowprovider, object iViewModel, JavascriptBindingMode iMode, object additional = null) { var context = windowprovider.HTMLWindow.MainFrame; var mapper = await context.EvaluateAsync(() => new BidirectionalMapper(iViewModel, context, windowprovider.UIDispatcher, iMode, additional)); await mapper.Init(); return new HTML_Binding(context, mapper); }
internal static async Task <IHTMLBinding> Bind(IHTMLWindowProvider windowprovider, object iViewModel, JavascriptBindingMode iMode, object additional = null) { var context = windowprovider.HTMLWindow.MainFrame; var mapper = await context.EvaluateAsync(() => new BidirectionalMapper(iViewModel, context, windowprovider.UIDispatcher, iMode, additional)); await mapper.Init(); return(new HTML_Binding(context, mapper)); }
private void CleanWebControl(ref IHTMLWindowProvider iWebControl) { if (iWebControl == null) { return; } //iWebControl.Crashed -= Crashed; iWebControl.HTMLWindow.ConsoleMessage -= ConsoleMessage; iWebControl.Dispose(); iWebControl = null; }
//private void Crashed(object sender, CrashedEventArgs e) //{ // if ((WebCore.IsShuttingDown) || (!WebCore.IsInitialized) || (Application.Current==null)) // return; // var dest = _CurrentWebControl.Source; // var vm = Binding.Root; // LogCritical("WebView crashed trying recover"); // _IWebViewLifeCycleManager.Dispose(_CurrentWebControl); // _CurrentWebControl.ConsoleMessage -= ConsoleMessage; // _CurrentWebControl.Crashed -= Crashed; // _CurrentWebControl = null; // Binding = null; // WebCore.QueueWork(() => Navigate(dest, vm, JavascriptBindingMode.TwoWay)); //} public Task Navigate(string iUri, object iViewModel, JavascriptBindingMode iMode = JavascriptBindingMode.TwoWay) { if (iUri == null) { throw ExceptionHelper.GetArgument(string.Format("ViewModel not registered: {0}", iViewModel.GetType())); } _Navigating = true; INavigable oldvm = (Binding != null) ? Binding.Root as INavigable : null; if (_UseINavigable && (oldvm != null)) { oldvm.Navigation = null; } var wh = new WindowHelper(new HTMLLogicWindow()); //if (_CurrentWebControl != null) // _CurrentWebControl.Crashed -= Crashed; Task closetask = (_CurrentWebControl != null) ? _Window.CloseAsync() : TaskHelper.Ended(); _NextWebControl = _IWebViewLifeCycleManager.Create(); _NextWebControl.HTMLWindow.ConsoleMessage += ConsoleMessage; TaskCompletionSource <IHTMLBinding> tcs = new TaskCompletionSource <IHTMLBinding>(); EventHandler <LoadEndEventArgs> sourceupdate = null; sourceupdate = (o, e) => { _NextWebControl.HTMLWindow.LoadEnd -= sourceupdate; HTML_Binding.Bind(_NextWebControl, iViewModel, iMode, wh). WaitWith(closetask, t => Switch(t, wh.__window__, tcs)); }; _Url = iUri; _NextWebControl.HTMLWindow.LoadEnd += sourceupdate; _NextWebControl.HTMLWindow.NavigateTo(iUri); return(tcs.Task); }
private void Switch(Task <IHTMLBinding> iBinding, HTMLLogicWindow iwindow, TaskCompletionSource <IHTMLBinding> tcs) { object oldvm = (Binding != null) ? Binding.Root : null; Binding = iBinding.Result; if (_CurrentWebControl != null) { _CurrentWebControl.HTMLWindow.ConsoleMessage -= ConsoleMessage; _CurrentWebControl.Dispose(); } else if (OnFirstLoad != null) { OnFirstLoad(this, EventArgs.Empty); } _CurrentWebControl = _NextWebControl; _NextWebControl = null; //_CurrentWebControl.Crashed += Crashed; _CurrentWebControl.Show(); _Window = iwindow; var inav = _UseINavigable ? Binding.Root as INavigable : null; if (inav != null) { inav.Navigation = this; } _Window.State = WindowLogicalState.Opened; _Window.OpenAsync().ContinueWith(t => EndAnimation(Binding.Root)); _Navigating = false; FireNavigate(Binding.Root, oldvm); if (tcs != null) { tcs.SetResult(Binding); } }
private void Switch(Task<IHTMLBinding> iBinding, HTMLLogicWindow iwindow, TaskCompletionSource<IHTMLBinding> tcs) { object oldvm = (Binding != null) ? Binding.Root : null; Binding = iBinding.Result; if (_CurrentWebControl!=null) { _CurrentWebControl.HTMLWindow.ConsoleMessage -= ConsoleMessage; _CurrentWebControl.Dispose(); } else if (OnFirstLoad != null) OnFirstLoad(this, EventArgs.Empty); _CurrentWebControl = _NextWebControl; _NextWebControl = null; //_CurrentWebControl.Crashed += Crashed; _CurrentWebControl.Show(); _Window = iwindow; var inav = _UseINavigable ? Binding.Root as INavigable : null; if (inav != null) inav.Navigation = this; _Window.State = WindowLogicalState.Opened; _Window.OpenAsync().ContinueWith(t => EndAnimation(Binding.Root)); _Navigating = false; FireNavigate(Binding.Root, oldvm); if (tcs != null) tcs.SetResult(Binding); }
private void CleanWebControl(ref IHTMLWindowProvider iWebControl) { if (iWebControl == null) return; //iWebControl.Crashed -= Crashed; iWebControl.HTMLWindow.ConsoleMessage -= ConsoleMessage; iWebControl.Dispose(); iWebControl = null; }
//private void Crashed(object sender, CrashedEventArgs e) //{ // if ((WebCore.IsShuttingDown) || (!WebCore.IsInitialized) || (Application.Current==null)) // return; // var dest = _CurrentWebControl.Source; // var vm = Binding.Root; // LogCritical("WebView crashed trying recover"); // _IWebViewLifeCycleManager.Dispose(_CurrentWebControl); // _CurrentWebControl.ConsoleMessage -= ConsoleMessage; // _CurrentWebControl.Crashed -= Crashed; // _CurrentWebControl = null; // Binding = null; // WebCore.QueueWork(() => Navigate(dest, vm, JavascriptBindingMode.TwoWay)); //} public Task Navigate(string iUri, object iViewModel, JavascriptBindingMode iMode = JavascriptBindingMode.TwoWay) { if (iUri == null) throw ExceptionHelper.GetArgument(string.Format("ViewModel not registered: {0}", iViewModel.GetType())); _Navigating = true; INavigable oldvm = (Binding != null) ? Binding.Root as INavigable : null; if (_UseINavigable && (oldvm!=null)) { oldvm.Navigation = null; } var wh = new WindowHelper(new HTMLLogicWindow()); //if (_CurrentWebControl != null) // _CurrentWebControl.Crashed -= Crashed; Task closetask = ( _CurrentWebControl!=null) ? _Window.CloseAsync() : TaskHelper.Ended(); _NextWebControl = _IWebViewLifeCycleManager.Create(); _NextWebControl.HTMLWindow.ConsoleMessage += ConsoleMessage; TaskCompletionSource<IHTMLBinding> tcs = new TaskCompletionSource<IHTMLBinding>(); EventHandler<LoadEndEventArgs> sourceupdate = null; sourceupdate = (o, e) => { _NextWebControl.HTMLWindow.LoadEnd -= sourceupdate; HTML_Binding.Bind(_NextWebControl, iViewModel, iMode, wh). WaitWith(closetask, t => Switch(t, wh.__window__, tcs)); }; _Url = iUri; _NextWebControl.HTMLWindow.LoadEnd += sourceupdate; _NextWebControl.HTMLWindow.NavigateTo(iUri); return tcs.Task; }