windows phone通过加载xaml动态创建控件

转自:http://www.devdiv.com/forum.php?mod=viewthread&tid=56767&fromuid=11531

一.准备XAML文件
    有时候我们需要加载一些来自文件,资源中的UI元素,例如保存在XAML文件中的UI元素。首先来准备一个待读取的XAML文件,我们可以通过创建一个文本文件并将其扩展名改为.xaml的方式来创建,但更好的方式是在Visual Studio中创建,方法如下:右击解决方案资源管理器中的项目选择添加新项,选择任意一个扩展名为.xaml的项均可,然后将自动生成的内容清空,添加如下的代码:
Ellipse.xaml文件中的XAML代码:

  1. <Ellipse xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  2.          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  3.          VerticalAlignment="Center" 
  4.          HorizontalAlignment="Center" 
  5.          Height="350" Width="350" >
  6.     <Ellipse.Fill>
  7.         <RadialGradientBrush  GradientOrigin="0.4,0.4" Center="0.4 0.4">
  8.             <GradientStop Color="White" Offset="0"/>
  9.             <GradientStop Color="Blue" Offset="1"/>
  10.         </RadialGradientBrush>
  11.     </Ellipse.Fill>
  12. </Ellipse>
复制代码
Rectangle.xaml文件中的XAML代码:
  1. <Rectangle xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  2.          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  3.          VerticalAlignment="Center" 
  4.          HorizontalAlignment="Center"
  5.            Height="300" Width="350">
  6.     <Rectangle.Fill>
  7.         <LinearGradientBrush StartPoint="0 0.5" EndPoint="1 0.5">
  8.             <GradientStop Color="Azure" Offset="0"/>
  9.             <GradientStop Color="Red" Offset="0.5"/>
  10.             <GradientStop Color="Orange" Offset="1"/>
  11.         </LinearGradientBrush  >
  12.     </Rectangle.Fill>
  13. </Rectangle>
复制代码
我分别创建了两个XAML文件,其中一个是圆形,一个是矩形,设置好它们相应的属性即可,注意要添加相应的xml名称空间(xmlns)。在Visual Studio中创建的好处是可以得到设计器的帮助,看到实时的效果,当然也可以使用Expression Blend来做。最后,要注意把Visual Studio自动创建的Code-Behind文件删掉。

二.解析XAML文件
    要解析XAML文件中的信息,需要借助于XamlReader类,它为分析XAML和创建相应的Silverlight对象树提供XAML处理器引擎。在Silverlight for Windows Phone中它只包含一个静态的Load方法,此方法用来分析一段格式良好的XAML片段并创建相应的Silverlight对象树,然后返回这个对象树的根。Load方法接受一个string类型的参数,我们可以将XAML文件中的代码直接传给它,不过在实际项目中,通常不会硬编码,所以采用与上篇文章中相同的方法,Application类的GetResourceStream方法,代码如下:
  1. T LoadXAMLAndGetShape<T>(string url)
  2.         {
  3.             string xaml = string.Empty;
  4.             StreamResourceInfo sri = Application.GetResourceStream(new Uri(url, UriKind.Relative));
  5.             using (StreamReader sr = new StreamReader(sri.Stream))
  6.             {
  7.                 xaml = sr.ReadToEnd();
  8.             }
  9.             T shape = (T)XamlReader.Load(xaml);
  10.             return shape;
  11.         }
复制代码
这里我创建了一个泛型方法,以便返回不同类型的对象。在方法中,通过Application.GetResourceStream方法加载XAML文件,然后用StreamReader将它读成字符串,最后将字符串传入XamlReader的Load方法来构造相应的类型。

三.使用读取到的Silverlight对象

读取到相应的对象后就可以进行自由的操作了,我在程序中添加了2个按钮用来在页面中呈现两个不同的对象,完整代码如下:
  1. using System;
  2. using System.IO;
  3. using System.Windows;
  4. using System.Windows.Markup;
  5. using System.Windows.Resources;
  6. using System.Windows.Shapes;
  7. using Microsoft.Phone.Controls;

  8. namespace WindowsPhoneLoadXAML
  9. {
  10.     public partial class MainPage : PhoneApplicationPage
  11.     {
  12.         Ellipse ellipse;

  13.         Rectangle rectangle;

  14.         // Constructor
  15.         public MainPage()
  16.         {
  17.             InitializeComponent();

  18.             ellipse = LoadXAMLAndGetShape<Ellipse>("/WindowsPhoneLoadXAML;component/Ellipse.xaml");

  19.             rectangle = LoadXAMLAndGetShape<Rectangle>("/WindowsPhoneLoadXAML;component/Rectangle.xaml");
  20.         }

  21.         T LoadXAMLAndGetShape<T>(string url)
  22.         {
  23.             string xaml = string.Empty;

  24.             StreamResourceInfo sri = Application.GetResourceStream(new Uri(url, UriKind.Relative));

  25.             using (StreamReader sr = new StreamReader(sri.Stream))
  26.             {
  27.                 xaml = sr.ReadToEnd();
  28.             }

  29.             T shape = (T)XamlReader.Load(xaml);

  30.             return shape;
  31.         }

  32.         private void btnEllipse_Click(object sender, RoutedEventArgs e)
  33.         {
  34.             if (ContentPanel.Children.Contains(rectangle))
  35.             {
  36.                 this.ContentPanel.Children.Remove(rectangle);
  37.             }
  38.             if (ellipse != null && !ContentPanel.Children.Contains(ellipse))
  39.             {
  40.                 this.ContentPanel.Children.Add(ellipse);
  41.             }
  42.         }

  43.         private void btnRectangle_Click(object sender, RoutedEventArgs e)
  44.         {
  45.             if (ContentPanel.Children.Contains(ellipse))
  46.             {
  47.                 this.ContentPanel.Children.Remove(ellipse);
  48.             }
  49.             if (rectangle != null && !ContentPanel.Children.Contains(rectangle))
  50.             {
  51.                 this.ContentPanel.Children.Add(rectangle);
  52.             }
  53.         }
  54.     }
  55. }
复制代码
下面是程序截图:
2.jpg  1.jpg 

四.下载示例代码:
  WindowsPhoneLoadXAML.zip (77.91 KB, 下载次数: 2216, 售价: 1 资源分)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值