/// <summary> /// Creates a new instance of the <see cref="ImGuiView"/> class. /// </summary> /// <param name="uv">The Ultraviolet context.</param> /// <param name="uiPanel">The <see cref="UIPanel"/> that is creating the view.</param> /// <param name="uiPanelDefinition">The <see cref="UIPanelDefinition"/> that defines the view's containing panel.</param> /// <param name="vmfactory">A view model factory which is used to create the view's initial view model, or <see langword="null"/> to skip view model creation.</param> /// <returns>The <see cref="ImGuiView"/> that was created.</returns> public static ImGuiView Create(UltravioletContext uv, UIPanel uiPanel, UIPanelDefinition uiPanelDefinition, UIViewModelFactory vmfactory) { Contract.Require(uv, nameof(uv)); Contract.Require(uiPanel, nameof(uiPanel)); Contract.Require(uiPanelDefinition, nameof(uiPanelDefinition)); var viewElement = uiPanelDefinition.ViewElement; if (viewElement == null) { return(null); } var viewModelType = default(Type); var viewModelTypeName = (String)viewElement.Attribute("ViewModelType"); if (viewModelTypeName != null) { viewModelType = Type.GetType(viewModelTypeName, false) ?? throw new InvalidOperationException(ImGuiStrings.ViewModelTypeNotFound.Format(viewModelTypeName)); } return(new ImGuiView(uv, uiPanel, viewModelType)); }
/// <summary> /// Loads an instance of the <see cref="PresentationFoundationView"/> from an XML node. /// </summary> /// <param name="uv">The Ultraviolet context.</param> /// <param name="uiPanel">The <see cref="UIPanel"/> that is creating the panel.</param> /// <param name="uiPanelDefinition">The <see cref="UIPanelDefinition"/> that defines the view.</param> /// <param name="vmfactory">A view model factory which is used to create the view's initial view model, or <see langword="null"/> to skip view model creation.</param> /// <returns>The <see cref="PresentationFoundationView"/> that was loaded from the specified XML element.</returns> public static PresentationFoundationView Load(UltravioletContext uv, UIPanel uiPanel, UIPanelDefinition uiPanelDefinition, UIViewModelFactory vmfactory) { Contract.Require(uv, nameof(uv)); Contract.Require(uiPanel, nameof(uiPanel)); Contract.Require(uiPanelDefinition, nameof(uiPanelDefinition)); var viewElement = uiPanelDefinition.ViewElement; if (viewElement == null) return null; // Determine which culture to use when parsing values. var cultureRequested = (String)uiPanelDefinition.RootElement.Attribute("Culture"); var cultureInfo = CultureInfo.GetCultureInfo(cultureRequested ?? String.Empty); // Determine the type of view model used by this view. var viewModelType = default(Type); var viewModelTypeName = (String)viewElement.Attribute("ViewModelType"); if (viewModelTypeName != null) { viewModelType = Type.GetType(viewModelTypeName, false); if (viewModelType == null) throw new UvmlException(PresentationStrings.ViewModelTypeNotFound.Format(viewModelTypeName)); var viewModelWrapperAttr = viewModelType.GetCustomAttributes(typeof(ViewModelWrapperAttribute), false) .Cast<ViewModelWrapperAttribute>().SingleOrDefault(); if (viewModelWrapperAttr != null) { viewModelType = viewModelWrapperAttr.WrapperType; } else { var viewModelWrapperName = PresentationFoundationView.GetDataSourceWrapperNameForView(uiPanelDefinition.AssetFilePath); var viewModelWrapperType = uv.GetUI().GetPresentationFoundation().GetDataSourceWrapperTypeByName(viewModelWrapperName); if (viewModelWrapperType == null) throw new UvmlException(PresentationStrings.CannotFindViewModelWrapper.Format(viewModelWrapperName)); viewModelType = viewModelWrapperType; } } // Create a UVML template which will instantiate the view. AddUvmlAnnotations(viewModelType.Name, viewElement); var viewTemplate = new UvmlTemplate(viewElement, typeof(PresentationFoundationView), (puv, pname) => { var view = new PresentationFoundationView(puv, uiPanel, viewModelType); var viewModel = vmfactory == null ? null : vmfactory(view); if (viewModel != null) { view.SetViewModel(viewModel); } var root = view.LayoutRoot; root.BeginInit(); var rootAdornerDecorator = new AdornerDecorator(puv, null); rootAdornerDecorator.BeginInit(); root.Child = rootAdornerDecorator; var rootGridTemplate = CreateTemplateFromXml(puv, viewElement, null, typeof(Grid), cultureInfo); var rootGridContext = UvmlInstantiationContext.ForView(puv, view); var rootGridTemplateInstance = (UvmlTemplateInstance)rootGridTemplate.Instantiate(puv, rootGridContext); var rootGrid = (Grid)rootGridTemplateInstance.Finalize(); rootAdornerDecorator.Child = rootGrid; return view; }); // Instantiate the view template. var viewTemplateInstance = (UvmlTemplateInstance)viewTemplate.Instantiate(uv, null); var viewInstance = (PresentationFoundationView)viewTemplateInstance.Finalize(); var viewRoot = viewInstance.LayoutRoot; var viewRootAdornerDecorator = (AdornerDecorator)viewRoot.Child; viewRootAdornerDecorator.EndInit(); viewRoot.EndInit(); viewRoot.CacheLayoutParameters(); var viewInstanceViewModel = viewInstance.ViewModel; if (viewInstanceViewModel != null) viewInstance.Namescope.PopulateFieldsFromRegisteredElements(viewInstanceViewModel); return viewInstance; }
/// <summary> /// Loads an instance of the <see cref="PresentationFoundationView"/> from an XML node. /// </summary> /// <param name="uv">The Ultraviolet context.</param> /// <param name="uiPanel">The <see cref="UIPanel"/> that is creating the panel.</param> /// <param name="uiPanelDefinition">The <see cref="UIPanelDefinition"/> that defines the view.</param> /// <param name="vmfactory">A view model factory which is used to create the view's initial view model, or <see langword="null"/> to skip view model creation.</param> /// <returns>The <see cref="PresentationFoundationView"/> that was loaded from the specified XML element.</returns> public static PresentationFoundationView Load(UltravioletContext uv, UIPanel uiPanel, UIPanelDefinition uiPanelDefinition, UIViewModelFactory vmfactory) { Contract.Require(uv, nameof(uv)); Contract.Require(uiPanel, nameof(uiPanel)); Contract.Require(uiPanelDefinition, nameof(uiPanelDefinition)); var viewElement = uiPanelDefinition.ViewElement; if (viewElement == null) { return(null); } // Determine which culture to use when parsing values. var cultureRequested = (String)uiPanelDefinition.RootElement.Attribute("Culture"); var cultureInfo = CultureInfo.GetCultureInfo(cultureRequested ?? String.Empty); // Determine the type of view model used by this view. var viewModelType = default(Type); var viewModelTypeName = (String)viewElement.Attribute("ViewModelType"); if (viewModelTypeName != null) { viewModelType = Type.GetType(viewModelTypeName, false); if (viewModelType == null) { throw new UvmlException(PresentationStrings.ViewModelTypeNotFound.Format(viewModelTypeName)); } var viewModelWrapperAttr = viewModelType.GetCustomAttributes(typeof(ViewModelWrapperAttribute), false) .Cast <ViewModelWrapperAttribute>().SingleOrDefault(); if (viewModelWrapperAttr != null) { viewModelType = viewModelWrapperAttr.WrapperType; } else { var viewModelWrapperName = PresentationFoundationView.GetDataSourceWrapperNameForView(uiPanelDefinition.AssetFilePath); var viewModelWrapperType = uv.GetUI().GetPresentationFoundation().GetDataSourceWrapperTypeByName(viewModelWrapperName); if (viewModelWrapperType == null) { throw new UvmlException(PresentationStrings.CannotFindViewModelWrapper.Format(viewModelWrapperName)); } viewModelType = viewModelWrapperType; } } // Create a UVML template which will instantiate the view. var viewTemplate = new UvmlTemplate(viewElement, typeof(PresentationFoundationView), (puv, pname) => { var view = new PresentationFoundationView(puv, uiPanel, viewModelType); var viewModel = vmfactory == null ? null : vmfactory(view); if (viewModel != null) { view.SetViewModel(viewModel); } var root = view.LayoutRoot; root.BeginInit(); var rootAdornerDecorator = new AdornerDecorator(puv, null); rootAdornerDecorator.BeginInit(); root.Child = rootAdornerDecorator; var rootGridTemplate = CreateTemplateFromXml(puv, viewElement, null, typeof(Grid), cultureInfo); var rootGridContext = UvmlInstantiationContext.ForView(puv, view); var rootGridTemplateInstance = (UvmlTemplateInstance)rootGridTemplate.Instantiate(puv, rootGridContext); var rootGrid = (Grid)rootGridTemplateInstance.Finalize(); rootAdornerDecorator.Child = rootGrid; return(view); }); // Instantiate the view template. var viewTemplateInstance = (UvmlTemplateInstance)viewTemplate.Instantiate(uv, null); var viewInstance = (PresentationFoundationView)viewTemplateInstance.Finalize(); var viewRoot = viewInstance.LayoutRoot; var viewRootAdornerDecorator = (AdornerDecorator)viewRoot.Child; viewRootAdornerDecorator.EndInit(); viewRoot.EndInit(); viewRoot.CacheLayoutParameters(); var viewInstanceViewModel = viewInstance.ViewModel; if (viewInstanceViewModel != null) { viewInstance.Namescope.PopulateFieldsFromRegisteredElements(viewInstanceViewModel); } return(viewInstance); }