WPF:在运行时将带有功能的页面作为XAML添加到窗口中

WPF:在运行时将带有功能的页面作为XAML添加到窗口中,wpf,xaml,Wpf,Xaml,我已经创建了一个WPF应用程序,在其中我使用c#代码动态构建XAML元素,然后将它们添加到根“容器”网格中 我试图做的是利用Blend中的特性,创建一些XAML页面,这些页面在逻辑、故事板等后面有自己的代码集 我希望在运行时加载该XAML,但是由于某种原因,我的方法不起作用,我不知道为什么 这就是我以前做的。在我的根窗口中,我创建了一个新的MyModule并将其添加到我的contentRoot myModule = new MyModule(); contentRoot.Children.A

我已经创建了一个WPF应用程序,在其中我使用c#代码动态构建XAML元素,然后将它们添加到根“容器”网格中

我试图做的是利用Blend中的特性,创建一些XAML页面,这些页面在逻辑、故事板等后面有自己的代码集

我希望在运行时加载该XAML,但是由于某种原因,我的方法不起作用,我不知道为什么

这就是我以前做的。在我的根窗口中,我创建了一个新的MyModule并将其添加到我的contentRoot

 myModule = new MyModule();
 contentRoot.Children.Add(myModule );
(有效的方法)MyModule类扩展了画布,由.XAML文件和.CS代码隐藏文件组成。XAML只是根画布,而.CS拥有创建元素并将其添加到根画布的所有逻辑

当我在MyModule现在扩展页面的地方使用相同的方法时,没有显示任何内容。XAML现在有很多内容,包括Canvas.Resources Canvas.Triggers和一堆其他元素

如何在运行时从包含代码隐藏逻辑的类加载预先创建的XAML内容

FileStream xamlFile = new FileStream("Resources/News/NewsModuleCanvas.xaml", FileMode.Open, FileAccess.Read);
Canvas newsCanvas = (Canvas)XamlReader.Load(xamlFile);
contentRoot.Children.Add(newsCanvas);

使用它来加载XAML,但是这仍然没有给我添加代码隐藏逻辑的选项。

我觉得这个问题有点不清楚,但这里有一些对我有用的东西

将MyModule定义为:

<Page x:Class="WpfApplication3.MyModule"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
</Page>


public partial class MyModule : Page
{
    public MyModule()
    {
        InitializeComponent();
        this.Content = new TextBlock(new Run("WOW!"));
    }
}
本地var c是MyModule的一个实例,因此该类中的所有代码都可用。这就是你要找的吗

您不能在独立XAML文件中使用x:Class属性,因为这意味着XAML是一个部分类,而该类的其余部分在其他地方声明。XamlReader只是不支持它


请记住,在读取XAML文件时,您是在读取序列化对象。无法将代码动态注入到任意独立的xaml文件中。

页面和画布是xaml中两种不同的组件

页面是框架元素,画布是容器,可以使用绝对x、y坐标放置多个控件。在其他页面只有一个属性“内容”时,可以考虑页面是高级内容控件。

Blend必须创建与Canvas相关的方法,这些方法类似于“Canvas.SetLeft”等,但它们肯定不会在页面中工作

您的页面类必须有一个类型为“Canvas”的内容,并且必须在页面内的“Canvas”中添加所有控件,这将对您有所帮助

这是来自MSDN的文本

一个页面只能有一个子元素。页面上的所有其他元素都必须是该元素的后代。通常,页面内容承载一个布局元素,如Grid、StackPanel和DockPanel,它们承载页面内容

在您的情况下,页面应该承载一个元素“Canvas”并添加项目

或者你为什么不试试这个,让你的MyModule和它一样,然后你创建一个新的页面,叫做MyModulePage,它应该是这样的

<MyModulePage>
    <MyModule/> <!-- that is your canvas generated in blend -->
</MyModulePage>


您是说要将任意代码注入此XAML文件?你的代码隐藏在哪里?注入,我不这么认为,我只想访问代码隐藏中包含的一些方法,以及访问一些XAML元素,比如故事板。你知道你是否可以访问c内部的属性,例如,启动/停止故事板吗?
FileStream xamlFile = new FileStream("MyModuleStandalone.xaml", FileMode.Open, FileAccess.Read);
MyModule c= (MyModule)XamlReader.Load(xamlFile);
this.Content = c;
<MyModulePage>
    <MyModule/> <!-- that is your canvas generated in blend -->
</MyModulePage>