`

动态加载XAML文件

阅读更多

Silverlight 2 提供了 System.Windows.Markup.XamlReader.Load(string xaml) 来动态的创建 XAML , 但这差不多限于短小的 xaml 片段创建,若要是从 xaml 文件直接读取创建,则写一个函数 LoadXaml 比较现实。

XAML 文件本身也是资源,因此资源的 Build Action (生成操作)不同,则引用该文件的 uri 也不同。例如 build action "Resource" 时,资源文件嵌入到程序集中;为 "Content" 时,只打包进 .xap 中等等,可参考《 Silverlight Resource 概 览 》。

 

代码比描述更能表 达意思,参考解决方案资源管理器和运行结果图示。 btn1.xaml 文件里其实也仅仅拿了个 button 作为示例: <Button xmlns='http://schemas.microsoft.com/client/2007' Width="60" Height="50" Margin="10" Content="Page"></Button> btn2.xaml btn3.xaml 只是用 Content 的不同来显示不同的 Build Action btnRed 是用 string 方式创建的, btnDef 则是因为错误的引用 xaml 文件。 page.xaml 里有一个名称为 sp StackPanle 来承载这些 button ,别的没有。今天比较烦躁, Over Silverlight 2 昨晚 6 点正式发布,这周末再考虑升级。

public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Page_Loaded);
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            //Silverligh2 提供 XamlReader.Load(string xaml) 片段式 创建xaml。
            //命名空间"http://schemas.microsoft.com/client/2007" 不能少。
            string buttonXAML = "<Button xmlns='http://schemas.microsoft.com/client/2007' Width=\"60\" Height=\"50\" Content=\"string\" Margin=\"10\" Foreground=\"Red\"></Button>";
            Button btnRed = (Button)System.Windows.Markup.XamlReader.Load(buttonXAML);
            sp.Children.Add(btnRed);

            //从文件创建,该文件 的Build Action 为 "Page", 与"Resource"类似,被嵌入程序集内
            Button btn1 = (Button)LoadXaml("/LoadXaml;component/btns/btn1.xaml");
            sp.Children.Add(btn1);

            //从文件创建,该文件 的Build Action 为 "Resource",被嵌入程序集内
            //注意格式:"/命名空间;component/文件位置"
            Button btn2 = (Button)LoadXaml("/LoadXaml;component/btns/btn2.xaml");
            sp.Children.Add(btn2);

            //从文件创建,该文件 的Build Action 为 "Content",仅打包进.xap中,不在任何程序集内
            Button btn3 = (Button)LoadXaml("btns/btn3.xaml");
            sp.Children.Add(btn3);

            //从错误的文件创建,最终生成的是默认的对象
            Button btnDef = (Button)LoadXaml("btns/btn4.xaml");
            sp.Children.Add(btnDef);
        }

        /// <summary>
        /// 从xaml文件中 创建 xaml对象
        /// </summary>
        /// <param name="file">xaml文件的"地址"</param>
        /// <returns>返回xaml文件定义的对象</returns>
        public static object LoadXaml(string file)
        {
            Uri fileUri = new Uri(file, UriKind.Relative);
            System.Windows.Resources.StreamResourceInfo streamInfo = System.Windows.Application.GetResourceStream(fileUri);

            if ((streamInfo != null) && (streamInfo.Stream != null))
            {
                using (System.IO.StreamReader reader = new System.IO.StreamReader(streamInfo.Stream))
                {
                    return System.Windows.Markup.XamlReader.Load(reader.ReadToEnd());
                }
            }

            //若文件不存在,则返回默认创建的对象
            return CreateDefaultObject();
        }

        //创建默认对象,以一个简单的button为例
        public static object CreateDefaultObject()
        {
            Button btn = new Button();
            btn.Width = 60;
            btn.Height = 50;
            btn.Margin = new Thickness(10);
            btn.Foreground = new SolidColorBrush(Colors.Blue);
            btn.Content = "Default";
            return btn;
        }

    }

 xaml代码:

 

<UserControl x:Class="SilverlightApplication2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <Grid x:Name="LayoutRoot">
        <StackPanel x:Name="sp">
            
        </StackPanel>
  </Grid>
</UserControl>
 
分享到:
评论

相关推荐

    015.VS2017实现WPF_XamlReader_动态加载Xaml文件演示版.rar

    在本文中,我们将深入探讨如何使用Visual Studio 2017在WPF(Windows Presentation Foundation)应用程序中实现XamlReader来动态加载Xaml文件。XamlReader是.NET Framework中的一个关键工具,它允许我们在运行时解析...

    Wpf动态加载Xaml的3D模型文件

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中动态加载XAML文件来展示3D模型。WPF是Microsoft提供的一种强大的用户界面框架,支持丰富的图形和媒体功能,包括3D渲染。XAML(Extensible ...

    silverlight图表oxyplot例子--动态加载XAML

    本示例主要关注如何在 Silverlight 应用程序中使用 OxyPlot 动态加载 XAML 文件来创建交互式图表。 在 Silverlight 开发中,OxyPlot 提供了一个灵活的 API,允许开发者轻松地创建各种图表类型,如线图、柱状图、...

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

    动态加载XAML控件允许程序在运行时根据需要加载和添加UI组件,提供了更大的灵活性。 本文将深入探讨如何在WPF中实现动态加载XAML控件,并通过实例分析动态调用技巧。首先,我们需要了解WPF中的几种加载方式: 1. *...

    wpf把xaml保存成gif png 或者 jpg

    1. **加载XAML**:首先,你需要解析XAML文件并实例化对应的UI元素。这可以通过使用`XamlReader.Load()`方法完成,它将XAML字符串转换为`UIElement`对象。 2. **创建`RenderTargetBitmap`**:接下来,创建一个`...

    用xamlreader读写XAML页面

    通过使用XAMLReader,我们可以加载一个XAML文件,将其转换为一系列的对象实例,这些对象可以直接在应用程序中使用。XAMLReader的主要方法有`Read()`,它会返回一个`XamlNode`对象,表示XAML文档中的下一个节点。...

    XAML入门 word文档

    - **从代码中加载XAML**:除了静态加载XAML文件,还可以在运行时动态加载和解析XAML,以实现更灵活的应用程序设计。 学习XAML可以帮助开发者高效构建美观且功能丰富的桌面和移动应用程序,理解其语法和机制是成为...

    Xamarin XAML语言教程

    - 创建XAML文件后,需要将其与代码文件关联起来,以便在运行时加载并显示界面。 - **创建项目后再创建XAML文件**: - 在项目创建完成后,手动添加XAML文件。 - **创建项目时创建XAML文件**: - 在创建项目时选择...

    WPF动态调用资源文件

    在Windows Presentation Foundation(WPF)框架中,动态调用资源文件是一种常见的技术,它使得开发者能够在运行时根据需求加载和应用不同的资源。标题中的“WPF动态调用资源文件”特指在WPF应用程序中,如何根据用户...

    ILSpy_2.1.0.1603 baml存为xaml代码

    3. `ILSpy.sln`、`ILSpy.suo`:这是ILSpy项目的解决方案文件和用户选项文件,用Visual Studio打开`.sln`文件可以加载整个项目,`.suo`文件则存储了用户特定的设置和调试信息。 4. `README.txt`:通常包含项目的简短...

    Html/Xaml 转换器

    - 数据绑定:处理 XAML 中的数据绑定,转换为适合于浏览器环境的数据绑定解决方案,例如 JSON 或 AJAX 调用。 在实现过程中,开发者可能会面临以下挑战: - HTML 与 WPF 控件的不完全对应:某些 HTML 元素可能没有...

    你必须知道的XAML

    XAML提供了一种简洁的方式来定义UI元素,并且可以通过静态或动态的方式绑定到数据。 #### 二、XAML在Silverlight中的作用 在Silverlight环境中,XAML主要扮演以下几个角色: - **声明UI及其元素格式**:XAML用来...

    wpf mvvm动态加载菜单,无限级

    当应用启动时,视图模型可以从数据库、配置文件或任何其他数据源加载菜单数据,然后构建这个树形结构。 在WPF中,我们可以使用`ObservableCollection&lt;T&gt;`来存储菜单项,因为这个集合是支持数据绑定的,可以实时反映...

    如何将C#代码嵌入XAML文件

    然而,有时我们需要在XAML文件中直接引用或执行C#代码,以便实现更复杂的逻辑或动态行为。本教程将详细解释如何将C#代码嵌入XAML文件,以及这种做法的优缺点。 首先,理解C#与XAML的交互方式是至关重要的。在WPF中...

    WPF动态界面范例,XAML界面

    XAML文件通常以`.xaml`为扩展名,它使得非程序员也能通过直观的方式设计和编辑界面。例如,在这个"**WPFtest**"压缩包中可能包含了一个或多个`.xaml`文件,它们定义了用户界面的各种元素。 **WPF界面设计** 1. **...

    XAML入门精通资料

    - **从代码中加载XAML**:通过`XamlReader`类可以从代码动态加载和解析XAML。 - **XAML相关主题**:还有许多其他主题,如数据绑定、样式和模板等,这些是构建复杂UI的关键部分。 XAML的灵活性和声明性使得它成为...

    示例描述:本章介绍了XAML的语法,包括原理、使用方法以及事件处理等等。

    第8章(\C08) 示例描述:本章介绍了XAML的语法,包括原理、使用方法以及事件处理等等。 AttachedProperty 使用XAML中的附加属性。 CodebehindDemo 使用XAML中的... XamlReaderDemo 动态加载和编译XAML示例。

    把svg格式图形转成xaml格式

    1. **解析SVG文件**:这涉及到读取SVG文件的内容,提取其中的路径数据和其他形状信息。SVG文件通常包含一个或多个`&lt;path&gt;`元素,每个元素都有一个`d`属性,包含了描述图形的指令序列。 2. **转换路径数据**:SVG的...

    WPF后台动态调用样式文件

    在某些场景下,我们可能需要在后台动态地加载和应用样式文件,以实现更加灵活和可扩展的应用设计。本文将深入探讨如何在WPF后台动态调用样式文件,以实现这一功能。 首先,我们需要理解WPF中的样式和资源。样式...

    WPF资源文件在DLL中的用法

    它们可以存储在项目的各种位置,包括XAML文件、应用程序资源字典(App.xaml)、或者外部文件中。将资源文件放入DLL有以下好处: 1. **代码重用**:DLL可以作为独立的组件,供多个项目共享资源。 2. **组织结构**:...

Global site tag (gtag.js) - Google Analytics