Browse Source

A few fixes for better Parsing

pull/604/head
jogibear9988 12 years ago
parent
commit
d87cf6a2ca
  1. 19
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs
  2. 27
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignInstanceExtension.cs
  3. 125
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs
  4. 1
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj
  5. 8
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs

19
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs

@ -82,8 +82,23 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -82,8 +82,23 @@ namespace ICSharpCode.WpfDesign.AddIn
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;

27
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/DesignInstanceExtension.cs

@ -0,0 +1,27 @@ @@ -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;
}
}
}

125
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/TemplateHelper.cs

@ -35,90 +35,89 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -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<string, string>();
while (true)
var nav = xmlElement.CreateNavigator();
var ns = new Dictionary<string, string>();
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 = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/netfx/2007/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" + xaml + "</ResourceDictionary>";
StringReader stringReader = new StringReader(xaml);
XmlReader xmlReader = XmlReader.Create(stringReader);
var xamlReader = new XamlXmlReader(xmlReader, parentObject.ServiceProvider.SchemaContext);
var xaml = xmlElement.OuterXml;
xaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/netfx/2007/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" + xaml + "</ResourceDictionary>";
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;
}

1
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj

@ -69,6 +69,7 @@ @@ -69,6 +69,7 @@
<Compile Include="AssemblyInfo.cs" />
<Compile Include="CollectionElementsCollection.cs" />
<Compile Include="CollectionSupport.cs" />
<Compile Include="DesignInstanceExtension.cs" />
<Compile Include="DesignTimeProperties.cs" />
<Compile Include="IXamlErrorSink.cs" />
<Compile Include="MarkupCompatibilityProperties.cs" />

8
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs

@ -28,6 +28,7 @@ using System.Windows; @@ -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 @@ -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);

Loading…
Cancel
Save