diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs index e14941e535..ecd03af1c2 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs @@ -81,9 +81,24 @@ namespace ICSharpCode.WpfDesign.AddIn var compilation = SD.ParserService.GetCompilationForFile(file.FileName); var assembly = this.typeResolutionService.LoadAssembly(compilation.MainAssembly); var prj = SD.ProjectService.CurrentProject; - - var newUri = new Uri(("file://" + Path.Combine(prj.Directory, uri.OriginalString)).Replace("\\","/"), UriKind.RelativeOrAbsolute); - return newUri; + + if (uri.OriginalString.Contains(";")) + { + var parts = uri.OriginalString.Split(';'); + if (prj.Name == parts[0].Substring(1)) + { + var newUri = new Uri(("file://" + Path.Combine(prj.Directory, parts[1].Substring("component".Length + 1))).Replace("\\", "/"), UriKind.RelativeOrAbsolute); + return newUri; + } + } + else + { + var strg = uri.OriginalString; + if (strg.StartsWith("/")) + strg = strg.Substring(1); + var newUri = new Uri(("file://" + Path.Combine(prj.Directory, strg)).Replace("\\", "/"), UriKind.RelativeOrAbsolute); + return newUri; + } } return uri; diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignInstanceExtension.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignInstanceExtension.cs new file mode 100644 index 0000000000..fddb3fcadf --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignInstanceExtension.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Markup; + +namespace ICSharpCode.WpfDesign.XamlDom +{ + public class DesignInstanceExtension : MarkupExtension + { + public DesignInstanceExtension(Type type) + { + this.Type = type; + } + + public Type Type { get; set; } + + public bool IsDesignTimeCreatable { get; set; } + + public bool CreateList { get; set; } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return null; + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs index e2c71dfdfa..69ff8f8958 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs @@ -35,90 +35,89 @@ namespace ICSharpCode.WpfDesign.XamlDom { public static FrameworkTemplate GetFrameworkTemplate(XmlElement xmlElement, XamlObject parentObject) { - try - { - var nav = xmlElement.CreateNavigator(); - var ns = new Dictionary(); - while (true) + var nav = xmlElement.CreateNavigator(); + + var ns = new Dictionary(); + while (true) + { + var nsInScope = nav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml); + foreach (var ak in nsInScope) { - var nsInScope = nav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml); - foreach (var ak in nsInScope) - { - if (!ns.ContainsKey(ak.Key) && ak.Key != "") - ns.Add(ak.Key, ak.Value); - } - if (!nav.MoveToParent()) - break; + if (!ns.ContainsKey(ak.Key) && ak.Key != "") + ns.Add(ak.Key, ak.Value); } + if (!nav.MoveToParent()) + break; + } - var keyAttrib = xmlElement.GetAttribute("Key", XamlConstants.XamlNamespace); + foreach (var dictentry in ns) + { + xmlElement.SetAttribute("xmlns:" + dictentry.Key, dictentry.Value); + } + + var keyAttrib = xmlElement.GetAttribute("Key", XamlConstants.XamlNamespace); - if (string.IsNullOrEmpty(keyAttrib)) - xmlElement.SetAttribute("Key", XamlConstants.XamlNamespace, "$$temp&&§§%%__"); + if (string.IsNullOrEmpty(keyAttrib)) + xmlElement.SetAttribute("Key", XamlConstants.XamlNamespace, "$$temp&&§§%%__"); - var xaml = xmlElement.OuterXml; - xaml = "" + xaml + ""; - StringReader stringReader = new StringReader(xaml); - XmlReader xmlReader = XmlReader.Create(stringReader); - var xamlReader = new XamlXmlReader(xmlReader, parentObject.ServiceProvider.SchemaContext); + var xaml = xmlElement.OuterXml; + xaml = "" + xaml + ""; + StringReader stringReader = new StringReader(xaml); + XmlReader xmlReader = XmlReader.Create(stringReader); + var xamlReader = new XamlXmlReader(xmlReader, parentObject.ServiceProvider.SchemaContext); - var seti = new XamlObjectWriterSettings(); + var seti = new XamlObjectWriterSettings(); - var resourceDictionary = new ResourceDictionary(); - var obj = parentObject; - while (obj != null) + var resourceDictionary = new ResourceDictionary(); + var obj = parentObject; + while (obj != null) + { + if (obj.Instance is ResourceDictionary) { - if (obj.Instance is ResourceDictionary) + var r = obj.Instance as ResourceDictionary; + foreach (var k in r.Keys) { - var r = obj.Instance as ResourceDictionary; - foreach (var k in r.Keys) - { - if (!resourceDictionary.Contains(k)) - resourceDictionary.Add(k, r[k]); - } + if (!resourceDictionary.Contains(k)) + resourceDictionary.Add(k, r[k]); } - else if (obj.Instance is FrameworkElement) - { - var r = ((FrameworkElement)obj.Instance).Resources; - foreach (var k in r.Keys) - { - if (!resourceDictionary.Contains(k)) - resourceDictionary.Add(k, r[k]); - } - } - - obj = obj.ParentObject; } - - seti.BeforePropertiesHandler = (s, e) => + else if (obj.Instance is FrameworkElement) { - if (seti.BeforePropertiesHandler != null) + var r = ((FrameworkElement)obj.Instance).Resources; + foreach (var k in r.Keys) { - var rr = e.Instance as ResourceDictionary; - rr.MergedDictionaries.Add(resourceDictionary); - seti.BeforePropertiesHandler = null; + if (!resourceDictionary.Contains(k)) + resourceDictionary.Add(k, r[k]); } - }; + } + + obj = obj.ParentObject; + } - var writer = new XamlObjectWriter(parentObject.ServiceProvider.SchemaContext, seti); + seti.BeforePropertiesHandler = (s, e) => + { + if (seti.BeforePropertiesHandler != null) + { + var rr = e.Instance as ResourceDictionary; + rr.MergedDictionaries.Add(resourceDictionary); + seti.BeforePropertiesHandler = null; + } + }; - XamlServices.Transform(xamlReader, writer); + var writer = new XamlObjectWriter(parentObject.ServiceProvider.SchemaContext, seti); - var result = (ResourceDictionary)writer.Result; + XamlServices.Transform(xamlReader, writer); - var enr = result.Keys.GetEnumerator(); - enr.MoveNext(); - var rdKey = enr.Current; + var result = (ResourceDictionary)writer.Result; - var template = result[rdKey] as FrameworkTemplate; - result.Remove(rdKey); - return template; - } - catch (Exception) - { } + var enr = result.Keys.GetEnumerator(); + enr.MoveNext(); + var rdKey = enr.Current; - return null; + var template = result[rdKey] as FrameworkTemplate; + result.Remove(rdKey); + return template; } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj index dc41471707..20d8f9dbf5 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj @@ -69,6 +69,7 @@ + diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs index 1b9a490537..410fc9fb84 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs @@ -28,6 +28,7 @@ using System.Windows; using System.Windows.Interop; using System.Windows.Markup; using System.Xml; +using System.Windows.Media; namespace ICSharpCode.WpfDesign.XamlDom { @@ -743,6 +744,13 @@ namespace ICSharpCode.WpfDesign.XamlDom internal static object CreateObjectFromAttributeText(string valueText, XamlPropertyInfo targetProperty, XamlObject scope) { + if (targetProperty.ReturnType == typeof(Uri)) { + return scope.OwnerDocument.TypeFinder.ConvertUriToLocalUri(new Uri(valueText, UriKind.RelativeOrAbsolute)); + } else if (targetProperty.ReturnType == typeof(ImageSource)) { + var uri = scope.OwnerDocument.TypeFinder.ConvertUriToLocalUri(new Uri(valueText, UriKind.RelativeOrAbsolute)); + return targetProperty.TypeConverter.ConvertFromString(scope.OwnerDocument.GetTypeDescriptorContext(scope), CultureInfo.InvariantCulture, uri.ToString()); + } + return targetProperty.TypeConverter.ConvertFromString( scope.OwnerDocument.GetTypeDescriptorContext(scope), CultureInfo.InvariantCulture, valueText);