From 5c393c47ef0c1b81e978e6647f759f0eef6f783a Mon Sep 17 00:00:00 2001 From: jogibear9988 Date: Sun, 9 Nov 2014 17:37:47 +0100 Subject: [PATCH] Better XAML Namescope Handling in XamlObjectServuceProvider --- .../Project/TemplateHelper.cs | 70 +++++++++++++++++++ .../Project/XamlObjectServiceProvider.cs | 23 +++--- 2 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs new file mode 100644 index 0000000000..62119762ff --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs @@ -0,0 +1,70 @@ +// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Linq; +using System.Windows; + +namespace ICSharpCode.WpfDesign.XamlDom +{ + public static class TemplateHelper + { + public static FrameworkElementFactory XamlObjectToFrameworkElementFactory(XamlObject xamlObject) + { + var factory = new FrameworkElementFactory(xamlObject.ElementType); + foreach (var prop in xamlObject.Properties) + { + if (prop.IsCollection) + { + foreach (var propertyValue in prop.CollectionElements) + { + if (propertyValue is XamlObject && !((XamlObject)propertyValue).IsMarkupExtension) + { + factory.AppendChild(XamlObjectToFrameworkElementFactory((XamlObject)propertyValue)); + } + else if (propertyValue is XamlObject) + { + factory.SetValue(prop.DependencyProperty, ((XamlObject)propertyValue).Instance); + } + else + { + factory.SetValue(prop.DependencyProperty, prop.ValueOnInstance); + } + } + } + else + { + if (prop.PropertyValue is XamlObject && !((XamlObject)prop.PropertyValue).IsMarkupExtension) + { + factory.AppendChild(XamlObjectToFrameworkElementFactory((XamlObject)prop.PropertyValue)); + } + else if (prop.PropertyValue is XamlObject) + { + factory.SetValue(prop.DependencyProperty, ((XamlObject)prop.PropertyValue).Instance); + } + else + { + factory.SetValue(prop.DependencyProperty, prop.ValueOnInstance); + } + } + } + + return factory; + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs index 3cac378105..7d06a90ae6 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs @@ -197,40 +197,43 @@ namespace ICSharpCode.WpfDesign.XamlDom { ns = NameScopeHelper.GetNameScopeFromObject(xamlObj.Instance); - if (ns != null) - break; + if (ns != null) { + var obj = ns.FindName(name); + if (obj != null) + return obj; + } xamlObj = xamlObj.ParentObject; } - var obj = ns.FindName(name); - - return obj; + return null; } public object Resolve(string name, out bool isFullyInitialized) { - throw new NotImplementedException(); + var ret = Resolve(name); + isFullyInitialized = ret != null; + return ret; } public object GetFixupToken(IEnumerable names) { - throw new NotImplementedException(); + return null; } public object GetFixupToken(IEnumerable names, bool canAssignDirectly) { - throw new NotImplementedException(); + return null; } public IEnumerable> GetAllNamesAndValuesInScope() { - throw new NotImplementedException(); + return null; } public bool IsFixupTokenAvailable { - get { throw new NotImplementedException(); } + get { return false; } } public event EventHandler OnNameScopeInitializationComplete;