`
jiasongmao
  • 浏览: 670963 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

silverlight中如何把UIElement等对象转换为xaml字符串

阅读更多

silverlight类库中没有提供,在网上找了找,貌似资料很少。现把我找到的一个并做了小量的修改,现拿出来分享一下:

总共分为两个类:XamlHelper和XamlWriter。

 

XamlHelper.cs

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Reflection;
using System.Text.RegularExpressions;

namespace SARuntimeXAMLWriter
{
    internal class XamlHelper
    {
        internal static bool hasCollections(DependencyObject obj)
        {
            PropertyInfo[] props = obj.GetType().GetProperties();
            foreach (var prop in props)
                if (prop.Name != "Parent" && (prop.PropertyType.BaseType.Name == "Collection`1" || prop.PropertyType.Name == "Transform"))
                    return true;
            return false;
        }
        internal static bool hasDeepCollections(DependencyObject obj, PropertyInfo prop)
        {
            if (obj == null || prop.PropertyType.IsArray)
                return false;
            return ((prop.GetValue(obj, null) ?? new object()).ToString().StartsWith("System."));
        }
        internal static string getSilverlightCompatibleXaml(string xaml)
        {
            Regex reg = new Regex(@"(\<(/)?\w+\.Children\>)", RegexOptions.None);
            return reg.Replace(xaml, "").Replace("xName", "x:Name");
        }
    }
}

 

XamlWriter.cs

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Reflection;
using System.Text;
using System.Xml;

namespace SARuntimeXAMLWriter
{
    public class XamlWriter
    {
        public static string Write(DependencyObject parent)
        {
            StringBuilder sb = new StringBuilder();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(sb, settings);
            //if (!TypeValidator.isValid(parent))
            //    throw new TypeValidationException();
            writer.WriteStartElement(parent.GetType().Name);
            writeCLRProperties(parent, writer);
            writeDPs(parent, writer);
            writeBrushes(parent, writer);
            writeCollections(parent, writer);
            writer.WriteEndElement();
            writer.Flush();
            writer.Close();
            return XamlHelper.getSilverlightCompatibleXaml(sb.ToString());
        }
        private static void writeCLRProperties(DependencyObject target, XmlWriter writer)
        {
            PropertyInfo[] props = target.GetType().GetProperties();
            bool hdc = false;
            foreach (var prop in props)
            {
                hdc = XamlHelper.hasDeepCollections(target, prop);
                if (prop.Name == "Name")
                {
                    if (prop.GetValue(target, null).ToString() != "")
                        writer.WriteAttributeString("x" + prop.Name, prop.GetValue(target, null).ToString());
                }
                else if (prop.Name != "Parent" && prop.CanRead && prop.CanWrite && prop.GetValue(target, null) != null
                    && prop.PropertyType.BaseType.Name != "Collection`1" && prop.PropertyType.Name != "Brush"
                    && !hdc)
                {
                    var propValue = prop.GetValue(target, null).ToString();
                    if (!propValue.Equals("Infinity") && !propValue.Equals("NaN"))
                        writer.WriteAttributeString(prop.Name, prop.GetValue(target, null).ToString());
                }
            }
        }
        private static void writeDPs(DependencyObject target, XmlWriter writer)
        {
            //DPs problem
            try
            {
                writer.WriteAttributeString("Canvas.Left", target.GetValue(Canvas.LeftProperty).ToString());
                writer.WriteAttributeString("Canvas.Top", target.GetValue(Canvas.TopProperty).ToString());
                writer.WriteAttributeString("Canvas.ZIndex", target.GetValue(Canvas.ZIndexProperty).ToString());
            }
            catch { }
            try
            {
                writer.WriteAttributeString("Storyboard.TargetName", target.GetValue(Storyboard.TargetNameProperty).ToString());
                writer.WriteAttributeString("Storyboard.TargetProperty", target.GetValue(Storyboard.TargetPropertyProperty).ToString());
            }
            catch { }

        }
        private static void writeBrushes(DependencyObject target, XmlWriter writer)
        {
            PropertyInfo[] props = target.GetType().GetProperties();
            object val;
            foreach (var prop in props)
                if (prop.PropertyType.Name == "Brush" && (val = prop.GetValue(target, null) ?? new object()).ToString() != "")
                {
                    if (val.ToString() == "System.Object")
                        continue;
                    writer.WriteStartElement(prop.ReflectedType.Name + "." + prop.Name);
                    writer.WriteStartElement(val.ToString().Split('.')[3]);
                    writeCLRProperties((DependencyObject)val, writer);
                    writeDeepCollections((DependencyObject)val, writer);
                    writeCollections((DependencyObject)val, writer);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
        }
        private static void writeCollections(DependencyObject target, XmlWriter writer)
        {
            if (target == null)
                return;
            PropertyInfo[] props = target.GetType().GetProperties();
            int cnt;
            object val;
            string collectionElement = "";
            foreach (var prop in props)
                if (prop.Name != "Parent" && prop.PropertyType.BaseType != null && prop.PropertyType.BaseType.Name == "Collection`1")
                {
                    cnt = (int)prop.PropertyType.InvokeMember("get_Count", BindingFlags.InvokeMethod, null, prop.GetValue(target, null), null);
                    for (int i = 0; i < cnt; i++)
                    {
                        val = prop.PropertyType.InvokeMember("get_Item", BindingFlags.InvokeMethod, null, prop.GetValue(target, null), new object[] { i });
                        if (XamlHelper.hasCollections((DependencyObject)val))
                        {
                            if (collectionElement != prop.ReflectedType.Name + "." + prop.Name)
                            {
                                if (collectionElement != "")
                                    writer.WriteEndElement();
                                collectionElement = prop.ReflectedType.Name + "." + prop.Name;
                                writer.WriteStartElement(collectionElement);
                            }
                            writer.WriteStartElement(val.GetType().Name);
                            writeCLRProperties((DependencyObject)val, writer);
                            writeDPs((DependencyObject)val, writer);
                            writeBrushes((DependencyObject)val, writer);
                            writeCollections((DependencyObject)val, writer);
                            writer.WriteEndElement();
                        }
                        else
                        {
                            writer.WriteStartElement(val.GetType().Name);
                            writeCLRProperties((DependencyObject)val, writer);
                            writeDPs((DependencyObject)val, writer);
                            writeBrushes((DependencyObject)val, writer);
                            writeDeepCollections((DependencyObject)val, writer);
                            writer.WriteEndElement();
                        }
                    }
                    if (collectionElement != "")
                    {
                        writer.WriteEndElement();
                        collectionElement = "";
                    }
                }
                //TransformGroup not inherits from Collection, so it can not be added
                //through writeCollections/writeDeepCollections and we should handle
                //it separately
                else if (prop.PropertyType.Name == "Transform")
                {
                    val = prop.GetValue(target, null);
                    if (val == null)
                        continue;
                    if (val.GetType().ToString() != "System.Windows.Media.TransformGroup" ||
                        ((int)val.GetType().GetProperty("Children").GetValue(val, null).GetType().GetProperty("Count").GetValue(val.GetType().GetProperty("Children").GetValue(val, null), null)) == 0)
                        continue;
                    writer.WriteStartElement(prop.ReflectedType.Name + "." + prop.Name);
                    writer.WriteStartElement(val.GetType().Name);
                    writeCollections(val as DependencyObject, writer);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
        }
        private static void writeDeepCollections(DependencyObject target, XmlWriter writer)
        {
            PropertyInfo[] props = target.GetType().GetProperties();
            object val;
            foreach (var prop in props)
                if (prop.PropertyType.BaseType.Name != "Collection`1" && prop.PropertyType.Name != "Transform" && XamlHelper.hasDeepCollections(target, prop))
                {
                    val = prop.GetValue(target, null);
                    if (val != null & val.GetType().Equals(typeof(DependencyObject)))
                    {
                        writer.WriteStartElement(prop.Name);
                        writeCollections((DependencyObject)val, writer);
                        writer.WriteEndElement();
                    }
                }
        }
    }
}

 

示例:

 

前台代码:

<Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="200"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Canvas Height="100" Width="200" x:Name="myCanvas" Background="Beige">
            <TextBlock Text="Amyo Kabir"></TextBlock>
        </Canvas>
        <TextBox Grid.Row="1" x:Name="textBoxOutput"></TextBox>
    </Grid>

  

后台代码:

var root = XamlWriter.Write(myCanvas).Replace("x:", "");
            var elm = XElement.Parse(root);
            foreach (var child in myCanvas.Children)
            {
                elm.Add(XElement.Parse(XamlWriter.Write(child).Replace("x:", "")));
            }
            textBoxOutput.Text = elm.ToString();

 

 

textBoxOutput的内容为:

 

<Canvas Width="200" Height="100" MinWidth="0" MinHeight="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" FlowDirection="LeftToRight" Name="myCanvas" AllowDrop="False" Opacity="1" RenderTransformOrigin="0,0" IsHitTestVisible="True" Visibility="Visible" UseLayoutRounding="True" Canvas.Left="0" Canvas.Top="0" Canvas.ZIndex="0">
  <Canvas.Background>
    <SolidColorBrush Color="#FFF5F5DC" Opacity="1" />
  </Canvas.Background>
  <TextBlock FontSize="11" FontFamily="Portable User Interface" FontWeight="Normal" FontStyle="Normal" FontStretch="Normal" TextWrapping="NoWrap" TextTrimming="None" TextAlignment="Left" Text="Amyo Kabir" Padding="0,0,0,0" LineHeight="0" LineStackingStrategy="MaxHeight" MinWidth="0" MinHeight="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" FlowDirection="LeftToRight" AllowDrop="False" Opacity="1" RenderTransformOrigin="0,0" IsHitTestVisible="True" Visibility="Visible" UseLayoutRounding="True" Canvas.Left="0" Canvas.Top="0" Canvas.ZIndex="0">
    <TextBlock.Foreground>
      <SolidColorBrush Color="#FF000000" Opacity="1" />
    </TextBlock.Foreground>
  </TextBlock>
</Canvas>

 

分享到:
评论

相关推荐

    wpf把xaml保存成gif png 或者 jpg

    这可以通过使用`XamlReader.Load()`方法完成,它将XAML字符串转换为`UIElement`对象。 2. **创建`RenderTargetBitmap`**:接下来,创建一个`RenderTargetBitmap`对象,指定所需的分辨率和像素格式。`...

    在WPF中动态加载XAML中的控件实例代码

    在代码中,我们可以创建一个`StringReader`对象来读取字符串,然后利用`XmlTextReader`解析这个字符串,最后通过`XamlReader.Load()`方法将解析后的XML转换为实际的UI对象。示例代码如下: ```csharp public void...

    silverlight 对象和属性实用示例

    在本文中,我们将深入探讨Silverlight中的对象和属性,并通过实用示例来帮助您更好地理解和应用这些概念。 首先,让我们了解Silverlight的核心对象。在Silverlight中,UI元素是构建用户界面的基本组成部分,例如...

    XamlReader Demo

    例如,如果你有一个字符串,其中包含了你想要动态创建的控件的XAML定义,你可以使用XamlReader将这个字符串转换为实际的UI元素,然后添加到布局容器中。 ```csharp string xamlString = "点击我'/&gt;"; UIElement ...

    Silverlight 入门

    createFromXaml方法用于动态解析XAML字符串并创建对象,这在运行时创建和修改UI非常有用。访问和修改元素及属性通常通过FindName方法和依赖属性(Dependency Property)机制来实现。 五、图形与画刷 Silverlight...

    Silverlight仿小米时间选择控件

    在Silverlight中,控件是构建用户界面的基本元素,它们继承自`UIElement`类,拥有显示、布局和事件处理等功能。时间选择控件(TimePicker)通常用于让用户方便地选择时间,包括小时和分钟。在Windows Phone和WPF...

    把图片拖拽进Silverlight页面Demo 源代码

    接下来,你可以将BitmapSource对象转换为ImageSource,然后设置到Image控件的Source属性,从而在Silverlight页面上显示图片。 ```csharp private void LayoutRoot_Drop(object sender, DragEventArgs e) { if (e....

    Silverlight可隐藏面板

    在XAML中,我们可以为Panel设置一个名为`Visibility`的属性,该属性可以接受三个值:`Visible`(默认,表示元素可见)、`Collapsed`(元素不占用空间且不可见)和`Hidden`(元素占用空间但不可见)。要实现面板的...

    Silverlight4中打开GoogleMap

    在Silverlight 4中,开发人员可以利用Google Maps API来集成地图功能,为用户提供互动式的地理定位服务。本文将深入探讨如何在Silverlight应用程序中实现Google Map的集成,以及涉及的相关知识点。 首先,理解...

    silverlight 中实现拖动的扩展方法

    在Silverlight的应用开发中,实现对象的拖动功能是非常常见的需求之一。例如,在设计交互式的图表、布局编辑器或者游戏场景时,都需要让用户能够方便地拖动元素到指定的位置。但是,传统的实现方式可能会导致代码...

    Silverlight培训大纲.doc

    通过本培训大纲,学员将全面了解Silverlight技术,掌握开发富互联网应用程序的技能,包括界面设计、动画制作、多媒体处理以及数据交互等方面,为构建高效、美观的Web应用奠定坚实基础。如需进一步学习,可联系文中...

    Silverlight 自定义控件 模板化控件 (二)事件

    在本文中,我们将深入探讨Silverlight中的自定义控件,特别是关于模板化控件和事件的处理。在Silverlight开发中,自定义控件能够帮助我们实现特定的功能,提升用户体验,而模板化则是让控件外观和行为更具可定制性。...

    silverlight动画 Menu菜单效果!

    在本文中,我们将深入探讨Silverlight中的动画菜单效果,这是微软为Web开发提供的一种富交互技术。Silverlight作为WPF(Windows Presentation Foundation)的网络版本,允许开发者创建具有动态图形、视频和交互性...

    Silverlight面试题(选择题)

    - **元素与.NET Framework类型对应**:XAML中的每个元素都对应于.NET Framework中的一个特定类型,这有助于保持代码的一致性和可维护性。 - **节点树创建**:XAML不仅定义了用户界面的外观,还可以创建复杂的节点树...

    Silverlight2.0功能展示Demo源码

    UIElement.CaptureMouse() - 为 UIElement 对象释放鼠标捕捉 13、Silverlight(15) - 2.0数据之一次绑定, 单向绑定, 双向绑定, INotifyPropertyChanged, 数据转换, 数据验证 介绍 Silverlight 2.0 数据绑定: ...

    silverlight:对象拖动的优雅解决方案.docx

    3. **基于`TranslateTransform`偏移量的拖动**:`TranslateTransform`是WPF和Silverlight中的一个转换类型,允许对象在X和Y轴上平移。这种方法不仅适用于任何布局,而且可以利用Behavior进行封装,使其可以方便地...

    silverlight 画图

    在IT行业中,Silverlight是一种基于.NET Framework的浏览器插件,由微软开发,主要用于构建和展示丰富的交互式用户界面,尤其是在Web应用中。本篇文章将详细探讨Silverlight在画图和流程图方面的应用,以及如何实现...

    silverlight的全屏显示

    首先,在XAML中,我们可能会有一个按钮来触发全屏模式,例如: ```xml 全屏" Click="Button_Click"/&gt; ``` 在对应的后台代码(C#或VB.NET)中,`Button_Click`事件处理程序将是实现全屏的关键: ```csharp private...

    Silverlight 源码 图片缩放实例

    首先,我们要理解Silverlight中的基本元素,如UIElement和Visual,它们是构建界面的基础。UIElement提供了事件处理和布局管理,而Visual则处理绘图和可视化操作。在图片缩放的场景中,通常会用到Image控件,它是...

Global site tag (gtag.js) - Google Analytics